Размер структуры остается неизменным даже после добавления в него нового члена

0

когда просто выполняется

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 в качестве ответа !!!. Как? Что происходит?

  • 0
    Конфигурация компилятора на ideone.com ( ideone.com/6LYvXN ) выдает 12 как размер структуры.
  • 2
    Пожалуйста, НЕ делайте typedef struct {...} typename; Это C. Хотя это разрешено в C ++ для обратной совместимости, это не идиоматично. Это прямо раздражает. Используйте struct typename {...};
Показать ещё 1 комментарий
Теги:
string
struct

4 ответа

7
Лучший ответ

Возможно, заполнение происходит. Например, 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;
  • 0
    sizeof (int) только 4 байта
  • 0
    @Venkatesh Это то, что я ожидал.
Показать ещё 1 комментарий
0

Он называл упаковку структуры для достижения оптимального выравнивания памяти.

См. "Потерянное искусство сборки структуры C", чтобы понять, как и почему. Это было сделано точно так же как в C, так и в C++.

0

Похоже на 8-байтовое выравнивание.

Поэтому, если у вас есть тип данных, размер которого меньше 8 байтов, он все равно будет использовать 8 байтов.

Я предполагаю, что указатель имеет 8 байт, а int - всего 4 байта.

Вы можете принудительно выполнить выравнивание по 1 байт с помощью кода, описанного здесь. Структурное однобайтное выравнивание противоречит требованиям к выравниванию архитектуры? , Затем вы должны получить разный размер для первого случая.

  • 1
    «Так что если у вас есть какой-либо тип данных, который имеет менее 8 байтов, он все равно будет использовать 8 байтов», что не совсем так. std::string выравнивается до 8 байтов, поэтому не любые данные будут использовать 8 байтов, это зависит от того, что будет после этих данных.
  • 0
    Да, в этом случае. Я предполагаю, что std :: string составляет 8 байтов здесь, так как это (64-битный) указатель, а также выровненный 8 байтов ?!
-2

В C/C++ структуры "упаковываются" в байтовые куски. Вы можете указать, какой размер ваши структуры должны быть упакованы. Здесь ссылка: http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx

  • 0
    В C данные в структурах выровнены так же, как в C ++
  • 0
    да, это совершенно верно, действительно, C ++ основан на C ... почему -1?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню