Получение окончательного числа байтов последнего члена - PullRequest
0 голосов
/ 15 июля 2009

Привет,

Я могу найти размер в байтах поля после заполнения с помощью макроса offsetof ().

Что-то вроде


struct a
{
  char r ;
  char s[ 255 ] ;
} ;

// the size in bytes of r after compiler padding is going to be
int lenR = offsetof( a, s ) - offsetof( a, r ) ;

Но как я могу найти размер в байтах последнего поля структуры?

Ответы [ 3 ]

4 голосов
/ 15 июля 2009

Как насчет:

int lenS = sizeof(a) - offsetof(a, s);
3 голосов
/ 15 июля 2009

Заполнение не является частью определенного поля, оно является частью самой структуры. Если у меня есть структура, как

struct foo {
   T1 v1;
         // <--- some padding here (A)
   T2 v2;
         // <--- some padding here (B)
   T3 v3;
};

Является ли A отступной частью v1? v2 ?. B является частью v2? v3? Если вас беспокоит запутывание заполнения при выполнении таких вещей, как сохранение структуры в файл или тому подобное, большинство (все?) Компиляторов имеют механизм, позволяющий отключить заполнение структуры даже на основе структуры за структурой. Чтобы узнать размер последнего члена вашей структуры, в этом случае s, используйте sizeof, например

 struct a tmp;
 size_t size = sizeof(tmp.s);

Если вы не хотите создавать временный файл, вы можете воспользоваться тем, что sizeof происходит во время компиляции, ничего не делает во время выполнения и делает что-то вроде:

 namespace {
   const a& dummy_func();
 }
 size_t size = sizeof(dummy_func().s);

Пустой функционал не нужно реализовывать никогда.

Другой вариант -

struct a {
   ...
   typedef char s_type[255];
   s_type s;
};
size_t size = sizeof(a::s_type);
1 голос
/ 15 июля 2009

Я считаю, что размер первого элемента вашей структуры всегда будет равен sizeof(char), а размер второго элемента вашей структуры будет sizeof(char[255]). Любое заполнение, которое компилятор решит вставить, зависит от компилятора, и эта память не принадлежит вам. Другими словами, эта память недоступна вашему приложению, и любая попытка ее использования может привести к неопределенному поведению. Тем не менее, вы все равно всегда можете найти (и часто будете нуждаться) общий размер структуры, используя sizeof(struct a). Таким образом, размер полей соответствует ожидаемому, и заполнение не учитывается для отдельных полей, даже если оно увеличивает общий размер структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...