размер типа данных без использования sizeof - PullRequest
19 голосов
/ 02 августа 2009

У меня есть тип данных, скажем X, и я хочу узнать его размер без объявления переменной или указателя этого типа и, конечно, без использования оператора sizeof.

Возможно ли это? Я думал об использовании стандартных заголовочных файлов, которые содержат размер и диапазон типов данных, но не работают с пользовательским типом данных.

Ответы [ 21 ]

43 голосов
/ 02 августа 2009

На мой взгляд, это вписывается в категорию «как добавить два целых без использования ++, + = или +?». Это пустая трата времени. Вы можете попытаться избежать монстров неопределенного поведения, сделав что-то вроде этого.

size_t size = (size_t)(1 + ((X*)0));

Обратите внимание, что я не объявляю переменную типа или указатель на X.

12 голосов
/ 02 августа 2009

Посмотрите, sizeof - это языковая возможность для этого. Единственный, так что это единственный портативный способ добиться этого.

В некоторых особых случаях вы можете сгенерировать непереносимый код, который использует другую эвристику для понимания размера определенных объектов [*] (возможно, заставляя их отслеживать их собственный размер), но вам придется делать все ведение бухгалтерии самостоятельно.

[*] Объекты в очень общем смысле, а не в смысле ООП.

10 голосов
/ 05 августа 2009

Ну, я любитель ... но я пробовал эту проблему, и я получил правильный ответ без использования sizeof. Надеюсь это поможет.. Я пытаюсь найти размер целого числа.

int *a,*s, v=10;

a=&v;

s=a;

a++;

int intsize=(int)a-(int)s;

printf("%d",intsize);
5 голосов
/ 05 августа 2009

Правильный ответ на этот вопрос интервью: «Зачем мне это делать, когда sizeof () делает это для меня и является единственным переносимым способом сделать это?

4 голосов
/ 02 августа 2009

Возможность заполнения предотвращает все надежды без знания правил, используемых для ее введения. И это зависит от реализации.

3 голосов
/ 15 ноября 2009

Попробуйте это:

int a;
printf("%u\n", (int)(&a+1)-(int)(&a));
3 голосов
/ 02 августа 2009

Вы можете понять это, прочитав ABI для вашего конкретного процессора, который объясняет, как структуры располагаются в памяти. Это потенциально отличается для каждого процессора. Но если вы не пишете компилятор, удивительно, что вы не захотите просто использовать sizeof, который является Единственно верным путем для решения этой проблемы.

2 голосов
/ 11 февраля 2011

, если X имеет тип данных:

#define SIZEOF(X) (unsigned int)( (X *)0+1 )

если X является переменной:

#define SIZEOF(X) (unsigned int)( (char *)(&X+1)-(char *)(&X) )
2 голосов
/ 02 августа 2009

Посмотрите исходники компилятора. Вы получите:

  • размер стандартных типов данных.
  • правила заполнения конструкций

и отсюда ожидаемый размер чего-либо.

Если бы вы могли, по крайней мере, выделить место для переменной и вставить в нее некоторое значение часового значения, вы могли бы изменить его по частям и посмотреть, изменится ли значение, но это все равно не даст вам никакой информации о заполнении. 1011 *

1 голос
/ 06 июля 2013

Попробуйте:

 #include<stdio.h>

int main(){

  int *ptr = 0;

  ptr++;
  printf("Size of int:  %d",ptr);

  return 0;
...