LINUX.ORG.RU

Есть ли выравнивание данных в C/C++ структурах?


0

0

может ли C/C++ иметь «своё мнение» относительно данных в структуре, то есть, например, если идёт {uint8, uint8, uint8, uint32} вставить лишний байт перед uint32 «для ровного счёту» или ещё что-нибудь?

ну например

typedef struct {
uint64 root_rowid_tail;
uint16 type_id;
uint8 node_slots;
uint32 table_object_id;
uint32 next_index_object_id;
uint16 colnumber;
uint16 index_name_size;
} Tindexinfo_header;

★★★
Ответ на: комментарий от namezys

> Может, если стуртура не относится к простым.

а как определить? ;) классика: «#define sizeof_array (sizeof(array[MAX_ITEMS])/sizeof(array[1]))» vs. «#define sizeof_array_item sizeof(array[1])» + «#define sizeof_array (sizeof_array_item * MAX_ITEMS)» ;)

arsi ★★★★★
()
Ответ на: комментарий от namezys

всё совершенно верно :) кроме последнего абзаца… я его элементарно не распарсил %) хотя может и он верен, хз ;)

arsi ★★★★★
()
Ответ на: комментарий от svu

Ну да, при попытке невыровненного доступа к памяти на том же спарке приезжает автобус и увозит «разработчика» в ад, где этот самый «разработчик» gdb'жит программы, собранные gcc 2.95 без опции -g.

anonymous
()
Ответ на: комментарий от namezys

Компилятор имеет право как изменять выравнивание как ему кажется удобнее для данной платформы (кратно чему угодно), так и изменять public: и private: между собой.

9.2/11

Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).

anonymous
()
Ответ на: комментарий от arsi

Ну берем простую структу. Наследуемся от нее. Далее берем адресс, преобразуем к адресу родителя и опять работаем с POD структурами

namezys ★★★★
()
Ответ на: комментарий от anonymous

> Компилятор имеет право как изменять выравнивание как ему кажется удобнее

Сами привели же цитату. Класс, спецификаторы доступа. Я уже писал об этом

namezys ★★★★
()
Ответ на: комментарий от namezys

Это ложь. И вообще фразы типа «в стандарте» надо подкреплять ссылками на пункты стандарта.

9/1

A structure is a class defined with the class-key struct; its members and base classes (clause 10) are public by default (clause 11). A union is a class defined with the class-key union; its members are public by default and it holds only one data member at a time (9.5). [ Note: aggregates of class type are described in 8.5.1. — end note ] A POD-struct is an aggregate class that has no non-static data members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-declared copy assignment operator and no user-declared destructor. Similarly, a POD-union is an aggregate union that has no non-static data members of type non-POD-struct, non-POD-union (or array of such types) or reference, and has no user-declared copy assignment operator and no user-declared destructor. A POD class is a class that is either a POD-struct or a POD-union.

anonymous
()
Ответ на: комментарий от anonymous

Свои личные выподи оставь при себе

Теперь укажи в чем я не прав. Детали стандарта я не помню, смотреть мне лень, каждый день выравниванием данных в POD стуктурах я не занимаюсь - в моих задачах это вобще не важно. Все равно до того, как я написал - ты сюда и не лез.

Если ты ставишь своей целью меня достать, то у тебя это точно не получается

namezys ★★★★
()
Ответ на: комментарий от anonymous

фразы типа «в стандарте» надо подкреплять ссылками на пункты стандарта

люто одобряю эту фразу

jtootf ★★★★★
()
Ответ на: комментарий от madcore

> Например, прочитать из файла заданного формата?

По байтам читай. Это единственный кошерный способ.

anonymous
()

Я вчера с недосыпа не понял твоего вопроса. Мужик, всё проще.

Ты пытаешься «отображить» файл на структуры целиком. Идея сама по себе неплохая, но тут ты промахиваешься со всякими выравниваями.

Отображай файл постранично в структуры размером со страницу. Т.е. 64 килобайта, например. А доступ к отдельным «полям» (записям) делай через дополнительные функции-обвязки

zabivator
()
Ответ на: комментарий от catap

>Структура выравнивается по DWORD. Обычно он равен sizeof(long).

Ну так выравнивается или обычно? Зачем так говрорить?
Могу заверить, что компиляторы hisoft-c или turbo-c не выравнивали ни на dword, ни на sizeof(long) :)

madcore ★★★★★
()
Ответ на: комментарий от catap

> Структура выравнивается по DWORD. Обычно он равен sizeof(long).

Скомпиль в 16 битном режиме следующее: struct {char a; } a;

namezys ★★★★
()
Ответ на: комментарий от vahvarh

>то есть оно при выполнении этого кода даёт sefault?

sigbus.

legolegs ★★★★★
()
Ответ на: комментарий от catap

> Структура выравнивается по DWORD. Обычно он равен sizeof(long).

struct { char a; } b[100];

namezys ★★★★
()
Ответ на: комментарий от catap

Структура выравнивается по DWORD. Обычно он равен sizeof(long).

Структуры выравниваются по первому члену.

int main()
{
        struct { short i; } a[2];

        printf("%d %p %p\n", sizeof(a[0]), &a[0], &a[1]);
}

2 0xbf93e260 0xbf93e262

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну то есть ты согласен, что не по DWORD? :)

Да все вроде уже вкурили что по наибольшему.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от namezys

Далее - массивы не учитываются.

ДА, но например struct A {int a[3]};-12 ,байт, но может занимать и 256.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от tailgunner

> Ну то есть ты согласен, что не по DWORD? :)

абсолютно и бесповоротно.

limux
()
struct a{
 u8 a;
 u8 b;
 u8 c;
 u32 d;
}

=
8 a
8 b
8 c
8 пусто
32 d
=

nanoo_linux
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.