Компиляция заголовок:Убедите правильное выравнивание по станд :: строка
// myheader.h
class MyClass {
MyClass();
~MyClass();
unsigned int mMyUint;
bool bMyBool;
std::string sMyString;
};
с Visual Studio 2010/W4 (мне сказали, чтобы сделать это), цель x64, дает мне следующее warning C4121
:
'MyClass' : alignment of a member was sensitive to packing
, ссылаясь на строку, где находится std::string sMyString
. official help of Microsoft предлагает использовать #pragma pack(x)
, где x
будет 1, 2, 4 в зависимости от элементов, которые используются внутри его структуры/класса.
Нет, мне интересно, какое выравнивание использовать для std :: string? Моя идея заключалась в том, что std :: string не является ни компилятором, ни независимым от платформы. Есть ли способ решить эту проблему, особенно с учетом других членов, которые могут иметь любой другой агит?
Лучшим было бы независимое от компилятора (и даже портативное) решение.
Обновление: Относительно очень полезного ответа, предоставленного jalf: Нет, в этом файле я не использую #pragma pack(x)
. Я использовал его в другой структуре, где я использую бит-поля, которые я видел, заполняются, когда не используют #pragma pack(x)
. Теперь я был просто встревожен, столкнувшись с той же ловушкой, потому что не знал, как компилятор Microsoft разрешает std::string
.
Он просто говорит вам, что в вашей структуре есть пространство. Вы не должны упаковывать его без причины. Перестановка членов может заставить это глупое предупреждение уйти, просто проигнорируйте его. – PlasmaHH
Re. ваше обновление: попробуйте скопировать это определение класса в отдельный файл и скомпилировать его изолированно, не включив ничего лишнего. Если это все еще выдаст предупреждение, значит, Microsoft просто глупо. В противном случае это что-то из остальной части вашего кода (например, '#pragma pack (push)', без соответствующего 'pop'. – jalf