【问题标题】:What is sizeof(something) == 0?什么是 sizeof(something) == 0?
【发布时间】:2011-02-14 15:00:25
【问题描述】:

我有一个模板,它采用具有不同值的结构,例如:

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

在函数内部我使用 sizeof 操作符:跳转内存sizeof(Something);

有时我不想跳任何东西;我希望 sizeof 返回零。如果我放入一个空结构,它将返回 1;我可以在模板中添加什么以使 sizeof 返回零?

【问题讨论】:

标签: c++ templates sizeof


【解决方案1】:

sizeof 永远不会为零。 (原因:sizeof (T)T[] 类型数组中元素之间的距离,要求元素有唯一的地址)。

也许您可以使用模板进行 sizeof 替换,通常使用 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)

【讨论】:

  • 不能重载sizeof操作符
  • @Let_Me_Be - 我不认为这是建议的,但您可以制作外观和行为类似的东西,但在您关心的情况下返回 0。
  • @awoodland 嗯,是的,但它不能称为 sizeof。
  • @Let_Me_Be:我从来没有说过我要重新定义 sizeof 关键字,而是做一些可以替代使用的新东西。
【解决方案2】:

你怎么看?

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

是的,输出为 0。

但是这段代码不是标准的 C++。

【讨论】:

【解决方案3】:

根据 C++ 标准,C++ 中的任何对象的大小不得为 0。只有基类子对象的大小可能为 0,但您永远不能对它们调用 sizeof。您想要实现的目标是无法实现的:) 或者,从数学上来说,方程

sizeof x == 0 在 C++ 中没有对象解决方案 :)

【讨论】:

  • C 中空结构的大小应该是 0,对吗?在 C++ 标准中强制它为 1 的理由是什么?什么是“1”,一个未知值的强制填充字节?
  • 因为空结构的数组仍然必须是可寻址的
  • @lundin:实际上不一定是 1 个字节。它可以是 4(在我的机器上是)或任何其他非负整数
  • @Lundin:确实。我刚刚尝试了 C 和 C++(gcc 4.3.2),空结构上的 sizeof 运算符在 C 中为 0,在 C++ 中为 1。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 2018-03-21
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多