Подтвердить что ты не робот

Получение размера переменной-члена

Если существует структура POD с некоторыми переменными-членами, например:

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
};

Есть ли способ получить размер переменной-члена в байтах, не создавая объект этого типа?

Я знаю, что это сработает:

foo fooObj;
std::cout << sizeof( fooObj.a ) << std::endl;
std::cout << sizeof( fooObj.b ) << std::endl;
std::cout << sizeof( fooObj.c ) << std::endl;

Будет ли оптимизировано компилятором следующее и предотвратить конструкцию объекта?

std::cout << sizeof( foo().a ) << std::endl;
4b9b3361

Ответ 1

5.3.3/1:

Оператор sizeof дает число байтов в представлении объекта его операнда. Операнд либо выражение , которое не оценивается, или идентификатор типа в скобках.

Вышеизложенное означает, что следующая конструкция хорошо определена:

sizeof( ((foo *) 0)->a);

Ответ 2

Вы можете сделать это в С++ 0x:

sizeof(foo::a);

Ответ 3

Используйте эту форму: sizeof(foo::a).

Ответ 4

Используйте очевидное:

sizeof( foo::a )

В С++ sizeof ВСЕГДА оценивается во время компиляции, поэтому стоимость выполнения не существует.

Ответ 5

С++ - 0x позволяет это сделать:

  std::cout << sizeof( foo::a ) << std::endl;
  std::cout << sizeof( foo::b ) << std::endl;
  std::cout << sizeof( foo::c ) << std::endl;

С++ - 0x позволяет sizeof работать с членами классов без явного объекта.

Статья находится здесь: Расширение sizeof для применения к нестатическим элементам данных без объекта (версия 1)

Я видел сообщение об этом выше слишком поздно. К сожалению.

Ответ 6

Вы можете создать оболочку макроса того, что предложил @Erik:

#define SIZE_OF_MEMBER(cls, member) sizeof( ((cls*)0)->member )

И затем используйте его как:

cout << SIZE_OF_MEMBER(foo, c) << endl;

Вывод:

50

Демо: http://www.ideone.com/ZRiMe

Ответ 7

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
   static const size_t size_a = sizeof(a);
   static const size_t size_b = sizeof(b);
   static const size_t size_c = sizeof(c);
};

Использование:

foo::size_a