Получение размера переменной-члена - PullRequest
24 голосов
/ 12 мая 2011

Если есть структура 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;

Ответы [ 7 ]

41 голосов
/ 12 мая 2011

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

sizeof(foo::a);
26 голосов
/ 12 мая 2011

5.3.3 / 1:

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

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

sizeof( ((foo *) 0)->a);
11 голосов
/ 12 мая 2011

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

9 голосов
/ 12 мая 2011

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

sizeof( foo::a )

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

1 голос
/ 13 мая 2011

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

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

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

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

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

1 голос
/ 12 мая 2011

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

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

, а затем использовать его как:

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

Вывод:

50

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

0 голосов
/ 12 мая 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...