Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Выравнивание sizeof, меняющийся размер структуры 
:(
    Опции темы
takedo
Дата 19.12.2005, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



?Привожу вопрос. Кто сможет ответить?


Цитата
Вот какая проблема:
есть структура:
struct AA
{
unsigned int A0;
unsigned int A1;
unsigned int A2;
unsigned int A3;
unsigned int A4;
unsigned int A5;
BYTE num_jp_win;
};
итого 6(unsigned int) + 1 BYTE;

size0 = 6*sizeof(unsigned int) + sizeof(BYTE);
///size0 = 25;!!!!

size1 = sizeof(AA);
//size1 = 28;!!!

видимо sizeof выравнивет по четырем байтам. Но первый вариант неудобен. В чем прикол?? Пишу на Visual Studio 2003


Это сообщение отредактировал(а) Coocky - 20.12.2005, 17:28


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Vyacheslav
Дата 19.12.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 59



sizeof показывает правильно, так как происходит выравнивание, установленое по умолчанию, а если тебя это не устраивает, то установи свое с помощью, например с помощью #pragma pack(1). И получишь свои 25


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Coocky
Дата 19.12.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



takedo
Так, давайте по теме!
Я удалил все сообщения, не связаные с темой!! smile
Цитата(Vyacheslav @ 19.12.2005, 14:42)
sizeof показывает правильно, так как происходит выравнивание, установленое по умолчанию,


Цитата(takedo @ 19.12.2005, 11:30)
видимо sizeof выравнивет по четырем байтам

Аболютно правильно



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 19.12.2005, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Из МСДН
Цитата

Когда Вы применяете sizeof оператор к структуре или названию типа союза, или к union type name, результат - число байтов в структуре или union type name, включая внутренний и таща дополнение. Этот размер может включить внутреннее и тянущееся дополнение, используемое, чтобы выровнять членов структуры или союза на границах памяти. Таким образом, результат, возможно, не соответствует размеру, вычисленному, складывая требования хранения индивидуальных членов.

Сорри за перевод smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 19.12.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Coocky
Цитата
видимо sizeof выравнивет по четырем байтам


Аболютно правильно
- только для Win32. smile
Добавлено @ 15:21
Vyacheslav
Цитата
#pragma pack(1).

после этого вообще - то можно и обратно...
Добавлено @ 15:22
ладно, прделагаю тему закрыть, получил бы я ответ, хоть и не так подробно...


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
DeadSoul
Дата 19.12.2005, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(takedo @ 19.12.2005, 15:19)
Coocky
Цитата
видимо sizeof выравнивет по четырем байтам
Аболютно правильно
- только для Win32. 

А для не Win32:
- скомпилировался бы данный код(BYTE - не вляется С++ типом, это typedef)?
- какое выравнивание стоит на .... платформе?




--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
takedo
Дата 20.12.2005, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



по умолчанию, видимо выравнивание идет по 32 битам, в win65 по 65. А то, что BYTE это unsigned char - так это тут ни причем. есть ещё где-то настройки проекта студии, но через pragma как всегда удобнее.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
bel_nikita
Дата 20.12.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



Про выравнивание читаем здесь

Это сообщение отредактировал(а) Coocky - 20.12.2005, 17:07


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0905 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.