Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Да, кстати, хорошо что напомнил про пустые структуры 21.11.05 11:04 Число просмотров: 1477
Автор: amirul <Serge> Статус: The Elderman
|
> Только есть единственная неприятность может быть с полным > покрытием и последующим memset, а именно, sizeof() никогда > не возращает 0 для структур и классов, даже для пустых (нет > членов): > > struct a { > }; > sizeof(a) !=0; // равно всегда 1 для пустой сруктуры, если > только не от чего не наследуем.
Мы уже когда то говорили об этом. Я тоже замечал, что под объекты в MSVC++ (для MSVC насколько я помню это не верно) ВСЕГДА выделяется память. Если объект пустой, то ему выделяется один байт. На досуге надо будет поковырять стандарт на предмет его отношения к данному вопросу.
> тогда > memset( & inst, 0, sizeof(a)) > ... скопирует один байт... но куда? Есть ли гарантия, что > этот байт уже распределён под структуру?
Да. В MSVC++ этот байт распределен под структуру. Когда то столкнулся с подобным - использовал класс просто как контейнер для функций членов, но не задал ни одного члена-данных - некоторое время ковырялся в асмовом листинге, пытаясь выяснить глюк ли это. В конце концов понял, что там действительно резервируется один байт под объект. Ну не любит msvc++ пустых объектов.
> В принципе, то что он говорит (хотя и не совсем про те > вещи, что мы обсуждали) правильно. > Наибольшие косяки возникают именно для массивов структур.
Да вроде нет. Надо конечно стандарт глянуть, но смещение элемента в массиве определяется как (index * sizeof(type)), то бишь элементы в МАССИВЕ не выравниваются (хотя последний элемент в структуре может быть выровнян)
> Хотя и там, дело не в sizeof... Как раз sizeof - то > сработает верно.
|
|
|