Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использование sizeof


Автор: GuManOiD 20.9.2005, 18:09
Вот есть такая структура:
Код

typedef struct list_element {
    char info[10];
    list_element *next;
} lst;


Мне надо узнать сколько байт она занимает(1),
по какойто причине
Код

printf("%i",sizeof(lst));

Выводит 16!!, но 10 чаров + 1 указатель = 14 БАЙТ!
Кто знает в чем проблема, отзовитесь!

Автор: _hunter 20.9.2005, 18:35
выравнивание в 1 байт поставь

Автор: GuManOiD 20.9.2005, 19:31
Цитата(_hunter @ 20.9.2005, 18:35)
выравнивание в 1 байт поставь

А как енто сделать???

Добавлено @ 19:31
smile

Автор: Дрон 20.9.2005, 19:42
Цитата(GuManOiD @ 20.9.2005, 20:31)
А как енто сделать???

Видишь вверху страницы текстовое поле, рядом с которым написано "Поиск:"?

Введи туда слово "выравнивание", нажми кнопочку "Go" и посмотри на результаты.

Автор: Nastya 23.9.2005, 12:31
#pragma pack(push, 1)
Цитата

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )
Specifies packing alignment for structure, union, and class members. pack gives control at the data-declaration level. This differs from compiler option /Zp, which only provides module-level control. pack takes effect at the first struct, union, or class declaration after the pragma is seen; pack has no effect on definitions. Calling pack with no arguments sets n to its default value. This is equivalent to compiler option /Zp8.

show (optional)
Displays the current byte value for packing alignment. The value is displayed by means of a warning message.
push (optional)
Puts a specified packing alignment value, n, on the internal compiler stack, and sets the current packing alignment value to n. If n is not specified, the current packing alignment value is pushed.
pop (optional)
Removes the record from the top of the internal compiler stack. If n is not specified with pop, then the packing value associated with the resulting record on the top of the stack is the new packing alignment value. If n is specified, for example, #pragma pack(pop, 16), n becomes the new packing alignment value. If you pop with identifier, for example, #pragma pack(pop, r1), then all records on the stack are popped until the record with identifier is found, and that record is popped and the packing value associated with the resulting record on the top of is the stack the new packing alignment value. If you pop with an identifier that is not found in any record on the stack, then the pop is ignored.
identifier (optional)
When used with push, assigns a name to the record on the internal compiler stack. When used with pop, pops records off the internal stack until identifier is removed; if identifier is not found on the internal stack, nothing is popped.
n (optional)
Specifies the value, in bytes, to be used for packing. The default value for n is 8. Valid values are 1, 2, 4, 8, and 16. The alignment of a member will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.
Consider the following example,

struct s
{
  int i;      // aligned on byte boundary 0, size is 4
  short j;      // aligned on byte boundary 4, size is 2
  double k;  // aligned on byte boundary 8, size is 8
}
n can be used with push or pop for setting a particular stack value, or alone for setting the current value used by the compiler.

For more information on modifying alignment, see:

__alignof
align
Example
// pragma_directives_pack.cpp
// compile with: /W1 /LD
#pragma pack()  // n defaults to 8; equivalent to /Zp8
#pragma pack(show)  // C4810
#pragma pack(4)  // n=4
#pragma pack(show)  // C4810
#pragma pack(push, r1, 16)  // n=16, pushed to stack
#pragma pack(show)  // C4810
#pragma pack(pop, r1, 2)  // n=2 , stack popped
#pragma pack(show)  // C4810
See Also
Pragma Directives




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)