Что такое sizeof (что-то) == 0? - PullRequest
       26

Что такое sizeof (что-то) == 0?

6 голосов
/ 14 февраля 2011

У меня есть шаблон, который принимает структуру с различными значениями, например:

struct Something
{
    char str[10];
    int value;
    ...
    ...
};

А внутри функции я использую оператор sizeof: переход в память sizeof(Something);

ИногдаЯ бы не хотел ничего прыгать;Я хочу, чтобы sizeof возвращал ноль.Если я добавлю пустую структуру, она вернет 1;Что я могу добавить в шаблон, чтобы sizeof возвращал ноль?

Ответы [ 3 ]

21 голосов
/ 14 февраля 2011

sizeof никогда не будет нулевым.(Причина: sizeof (T) - это расстояние между элементами в массиве типа T[], и элементы должны иметь уникальные адреса).

Возможно, вы можете использовать шаблоны для замены размера, что обычноиспользует sizeof, но специализируется для одного конкретного типа, чтобы дать ноль.

например,

template <typename T>
struct jumpoffset_helper
{
    enum { value = sizeof (T) };
};


template <>
struct jumpoffset_helper<Empty>
{
    enum { value = 0 };
};

#define jumpoffset(T) (jumpoffset_helper<T>::value)
14 голосов
/ 17 ноября 2017

Что вы думаете об этом?

 #include <iostream>
 struct ZeroMemory {
     int *a[0];
 };
 int main() {
     std::cout << sizeof(ZeroMemory);
 }

Да, вывод равен 0.

Но этот код не является стандартным C ++.

3 голосов
/ 14 февраля 2011

Ни один объект в C ++ не может иметь размер 0 в соответствии со стандартом C ++.Только подобъекты базового класса МОГУТ иметь размер 0, но тогда вы никогда не сможете вызвать sizeof для них.То, что вы хотите достичь, недостижимо :) или, математически, уравнение

sizeof x == 0 не имеет объектного решения в C ++:)

...