Нужно align, а C++0x ждать некогда :(

Тема в разделе "LANGS.C", создана пользователем _DEN_, 23 фев 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Нужен sizeof без учета выравнивания. В грядущем стандарте для этого вроде как будет оператор align. Хочется получить тоже самое в текущем.

    Мотивация:

    Проверить в комайл-тайме, целиком ли сериализован тип:

    BOOST_STATIC_ACCERT(sizeof(o) == sizeof(o.m1) + sizeof(o.m2) + sizeof(o.m3));

    При включенном выравнивании ассерт может валиться даже если перечислены все мемберы.
     
  2. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    FIELD_OFFSET, __alignof
     
  3. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    Сделай невыровненный дубликат типа (обёрнутый в #pragma pack).
    А вообще по возможности лучше перестроить тип так, чтобы зазоров между полями не было.

    Кстати, если класс содержит виртуальные ф-ции или виртуальные базовые классы, то его sizeof будет всегда больше суммы sizeof полей.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    asmfan

    Экстеншены не интересно...


    green

    Это хорошая идея, но опять же, это экстеншены. Это будет работать на gcc / icc? На камю-то уж точно не будет:

    Код (Text):
    1. "ComeauTest.c", line 1: warning: unrecognized #pragma
    Это теоретически невозможно - выравнивание может быть и 16 байт, а в структуре у меня может быть только один int.


    Знаю, но это пох, я полиморфные типы не сериализую.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    FIELD_OFFSET это не экстеншен, посмотри этот дефайн.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Посмотрел. Эта штука не поможет. В общем случае зная sizeof и имея набор смещений нельзя понять, все ли этот мемберы или нет.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Я пришел к выводу, что текущим стандартом это дело не решается - при выравнивании размер структуры может не поменяться если в нее добавить или удалить мемберы. Поэтому единственное решение которое я вижу это сделать выравнивание в 1 байт в дебаге, и заменить BOOST_STATIC_ASSERT на макросом, который является ассертом только в дебаге.