когда просто выполняется
cout << sizeof(string);
я получил 8 в качестве ответа.
теперь у меня есть структура
typedef struct {
int a;
string str;
} myType;
и я выполняю
cout << sizeof(myType);
Я получил 16 в качестве ответа.
теперь я внес изменения в свою структуру
typedef struct {
int a, b;
string str;
} myType;
и я выполняю
cout << sizeof(myType);
Я получил 16 в качестве ответа !!!. Как? Что происходит?
Возможно, заполнение происходит. Например, sizeof(int)
может быть 4 байта и компилятор может добавить 4 байта после того, как для выравнивания данных. a
Макет может быть таким:
typedef struct {
int a; // 4 bytes
// 4 bytes for padding
string str; // 8 bytes
} myType;
typedef struct {
int a; // 4 bytes
int b; // 4 bytes
string str; // 8 bytes
} myType;
Он называл упаковку структуры для достижения оптимального выравнивания памяти.
См. "Потерянное искусство сборки структуры C", чтобы понять, как и почему. Это было сделано точно так же как в C, так и в C++.
Похоже на 8-байтовое выравнивание.
Поэтому, если у вас есть тип данных, размер которого меньше 8 байтов, он все равно будет использовать 8 байтов.
Я предполагаю, что указатель имеет 8 байт, а int - всего 4 байта.
Вы можете принудительно выполнить выравнивание по 1 байт с помощью кода, описанного здесь. Структурное однобайтное выравнивание противоречит требованиям к выравниванию архитектуры? , Затем вы должны получить разный размер для первого случая.
std::string
выравнивается до 8 байтов, поэтому не любые данные будут использовать 8 байтов, это зависит от того, что будет после этих данных.
В C/C++ структуры "упаковываются" в байтовые куски. Вы можете указать, какой размер ваши структуры должны быть упакованы. Здесь ссылка: http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx