C/C++ struct packing
11 отговора
1 прегледа
C/C++ struct packing
Nqkoj da znae kak se iz4islqwa struct member alignment?
Iskam directno da rabotq s pametta na struct, oba4e ne moga
da namerq otmestwaniqta na member-ite...
Iskam directno da rabotq s pametta na struct, oba4e ne moga
da namerq otmestwaniqta na member-ite...
Re: C/C++ struct packing
/Zpn
When you specify this option, each structure member after the first is stored on either the size of the member type or n-byte boundaries (where n is 1, 2, 4, 8, or 16), whichever is smaller.
[линк]
When you specify this option, each structure member after the first is stored on either the size of the member type or n-byte boundaries (where n is 1, 2, 4, 8, or 16), whichever is smaller.
[линк]
Re: C/C++ struct packing
#pragma pack( [ n] )
Specifies packing alignment for structure and union members. Whereas the packing alignment of structures and unions is set for an entire translation unit by the /Zp option, the packing alignment is set at the data-declaration level by the pack pragma. The pragma takes effect at the first structure or union declaration after the pragma is seen; the pragma has no effect on definitions.
inache &(struct->member)
Specifies packing alignment for structure and union members. Whereas the packing alignment of structures and unions is set for an entire translation unit by the /Zp option, the packing alignment is set at the data-declaration level by the pack pragma. The pragma takes effect at the first structure or union declaration after the pragma is seen; the pragma has no effect on definitions.
inache &(struct->member)
Re: C/C++ struct packing
#pragma pack(...) standartizirano li e? znam 4e go ima w
microsoftskiq kompilator...
ne moga da izpolzwam &(struct->member) poneve ne znam
imenata na memberite a samo tipowete im, i za towa, trqbwa
da si smetna otmestwaniqta pri proizwolen alignment...
microsoftskiq kompilator...
ne moga da izpolzwam &(struct->member) poneve ne znam
imenata na memberite a samo tipowete im, i za towa, trqbwa
da si smetna otmestwaniqta pri proizwolen alignment...
Re: C/C++ struct packing
Abe towa e mnogo grubo taka da prawish. Pomisli pak za design-a na taia programa!
Редактирано от Lubo_R на
Re: C/C++ struct packing
Znam 4e ne e safe, oba4e strukturata mi idwa ot
wyn i nqmam druga informaciq oswen za tipowete
Problema e mnogo typ, za6toto na wsi4koto otgore
koda trqbwa da e prenosim !#$%#@$
Prosto nqmam izbor i trqbwa da podhodq grubo...
Za towa mnogo, mnogo mi trqbwa info po wyprosa....
wyn i nqmam druga informaciq oswen za tipowete
Problema e mnogo typ, za6toto na wsi4koto otgore
koda trqbwa da e prenosim !#$%#@$
Prosto nqmam izbor i trqbwa da podhodq grubo...
Za towa mnogo, mnogo mi trqbwa info po wyprosa....
Re: C/C++ struct packing
Izobsto ne e grubo. Tova si e savsem v reda na nestata. Ia opitai da prochetesh bitmap header-a bez da podravniavash na byte. Koi komunikacionen protokol smiatash che ste pochne da prasta bezsmislenni danni samo zaradi podravniavane? Normalo e dannite da se paketirat za da se namali trafika. Pri smiana na versiite i razrednostta na procesorite tova se polchava.
Taka che polzvai si spokoino podravniavaneto i izobsto ne se pritesniavai, prakticheski vsichki compilatori poddarzat smiana na podravniavaneto.
Taka che polzvai si spokoino podravniavaneto i izobsto ne se pritesniavai, prakticheski vsichki compilatori poddarzat smiana na podravniavaneto.
Re: C/C++ struct packing
#pragma pack() е стандартна директива. Досега не съм виждал компилатор, който да не го поддържа.
Все пак изчисляването на отместванията е доста грубо, както е казал колегата.
Опитай следния подход, щом знаеш типовете и реда на members.
1. Дефинирай своя структура, същата като тази, която получаваш.
2. Дефинирай указател към структура от този тип. Например:
struct myType *ps_myType;
3. Направи така, че указателя да сочи началото на паметта, където са разположени данните от структурата. Например
ps_myType = &some_address;
След това използвай собствената си дефиниция на структурата.
ps_myType->member1 - сочи към member1.
Така ще можеш да избегнеш промяната на цялата програма ако изведнъж от 32 битова минеш на 64 битова машина....
Успех.
Все пак изчисляването на отместванията е доста грубо, както е казал колегата.
Опитай следния подход, щом знаеш типовете и реда на members.
1. Дефинирай своя структура, същата като тази, която получаваш.
2. Дефинирай указател към структура от този тип. Например:
struct myType *ps_myType;
3. Направи така, че указателя да сочи началото на паметта, където са разположени данните от структурата. Например
ps_myType = &some_address;
След това използвай собствената си дефиниция на структурата.
ps_myType->member1 - сочи към member1.
Така ще можеш да избегнеш промяната на цялата програма ако изведнъж от 32 битова минеш на 64 битова машина....
Успех.
Re: Жоро: C/C++ struct packing
Za towa i az se setih, oba4e ima i 06te edna
gadna podrobnost - znam tipowete i reda na
memberite samo na edna 4ast ot na4aloto na
structurata, ostanalata 4ast mi e neizwestna...
Ako #pragma pack() naistina e standartna - ok -
6te mi swyr6i rabota sys neizbeven slow down,
no ako wse pak ima6 nqkakwa druga ideq,
6te sym ti blagodaren da ako mi q kave6!
gadna podrobnost - znam tipowete i reda na
memberite samo na edna 4ast ot na4aloto na
structurata, ostanalata 4ast mi e neizwestna...
Ako #pragma pack() naistina e standartna - ok -
6te mi swyr6i rabota sys neizbeven slow down,
no ako wse pak ima6 nqkakwa druga ideq,
6te sym ti blagodaren da ako mi q kave6!
Re: Жоро: C/C++ struct packing
Малко ми е трудно да давам мнение без да знам какво точно искаш да направиш, но ако скоростта ти е толкова критична - sizeof(int) ти връща размера на думата на съответния процесор. Данните в структурите се подравняват така, че всеки член да започва от границата на дума. Т.е. ако не използваш #pragma pack(1) за 32 битов процесор всеки member ще започва на адрес кратен на 4. Не съм сигурен обаче дали ще спестиш време, защото ще трябва да изчисляваш отместванията динамично. И вероятността за грешка е много по-голяма, да не говорим, че поддръжката на такъв код е трудна. При използването на #pragma - оптимизаторите вършат доста добра работа, като се стараят да оптимизират обмена между паметта и процесора. Така, че не знам кое решение ще е по-бързо.
Ако знаеш типа на членовете, реда им и размера на структурата би могъл да дефинираш непознатата част като масив от байтове и пак да ползваш подхода, който ти дадох. Ако не знаеш размера - тогава за съжаление не можеш да правиш никаква адресна аритметика. Бих те посъветвал ако тази структура се генерира от твоя програма да помислиш още малко за дизайна. Например можеш да разделиш данните на header, който е фиксиран и носи информация за структурата на останалата част от данните. Това, обаче е "изстрел в мъглата", защото както казах не знам нищо по задачата ти :-)))
Успех.
Ако знаеш типа на членовете, реда им и размера на структурата би могъл да дефинираш непознатата част като масив от байтове и пак да ползваш подхода, който ти дадох. Ако не знаеш размера - тогава за съжаление не можеш да правиш никаква адресна аритметика. Бих те посъветвал ако тази структура се генерира от твоя програма да помислиш още малко за дизайна. Например можеш да разделиш данните на header, който е фиксиран и носи информация за структурата на останалата част от данните. Това, обаче е "изстрел в мъглата", защото както казах не знам нищо по задачата ти :-)))
Успех.
Re: Жоро: C/C++ struct packing
Naprawih nqkoi prou4waniq za kompilatorite sno6ti,
i se okaza 4e wsi4ki poddyrvat pod edna ili druga forma
#pragma pack, taka 4e towa e moeto re6enie.
Blagodarq za pomo6ta!

i se okaza 4e wsi4ki poddyrvat pod edna ili druga forma
#pragma pack, taka 4e towa e moeto re6enie.
Blagodarq za pomo6ta!
Dali ...
Problema ne ti e v data alignment?
Toest compilera da pravi vsichko ravno na 4 ili8 bytes?
Toest compilera da pravi vsichko ravno na 4 ili8 bytes?