Размер структуры (sizeof) в C++ не соответствует реальному размеру в случае массивов

Я использую динамические массивы следующей структуры:

struct TestStructure
{
    unsigned int serial;
    int channel;
    int pedestal;
    int noise;
    int test;
};

Sizeof (TestStructure) возвращает 20, поэтому я предполагаю, что в структуре нет заполнения / выравнивания. Это логично, потому что есть только 4-байтовые типы.

Но я обнаружил, что размер структуры, умноженный на количество элементов, не равен размеру массива. Между элементами массива есть дополнительная накладка! Итак, в следующем коде:

TestStructure* test_struct = new TestStructure[element_count];
for (int i = 0; i < element_count; i++)
  FillStructure(test_struct, i, i, i, i, i, i); // assigning 'i' for all elements

Long_t size_value = element_count * sizeof(TestStructure);
unsigned char* p_value = new unsigned char[size_value];
memcpy(p_value, test_struct, size_value);

Выходной массив символов содержит дополнительные поля между элементами:

sizeof(TestStructure) = 20. element_count = 10. size_value = 200. char array in the hex format:
0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0
0 0 0 0
6c 6c 2f 6c

1 0 0 0 
1 0 0 0 
1 0 0 0 
1 0 0 0 
1 0 0 0 
6f 70 74 2f 

2 0 0 0 
...

Пожалуйста, объясни мне. Добавляет ли динамический массив прокладки между элементами или оператор sizeof показывает неправильный размер структуры?

PS Я использую GCC 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.2).

РЕДАКТИРОВАТЬ: я использую этот код в макросе с интерпретатором ROOT CINT с скомпилированной библиотекой GCC. Извините, похоже, эта ошибка связана не с GCC, а с ROOT CINT.

EDIT2: Да, в моем макросе ROOT (выполняется интерпретатором CINT) sizeof(TestStructure) возвращает 24, и после этого, когда я вызываю функцию скомпилированной библиотеки GCC (содержащей фрагмент кода, перечисленный выше), sizeof(TestStructure) возвращает 20 в скомпилированная функция.

1 ответ

Решение

Хотя компилятор может добавить упаковку в конец structКомпилятор абсолютно не может добавить дополнительную упаковку между элементами при создании массива.

Для массива TestStructure[n]адрес элемента i(th) должен быть TestStructure + i * sizeof TestStructure, Если бы это было не так, то арифметика указателей ужасно сломалась бы.

Другие вопросы по тегам