【问题标题】:What's the biggest data type in C++C++中最大的数据类型是什么
【发布时间】:2016-03-03 08:06:00
【问题描述】:

我搜索了 C++ 中最大的数据类型,但每个站点都编写了不同的数据类型。如果有专家,他(她)能不能写答案。这一点很重要。 谢谢。

【问题讨论】:

  • (unsigned) long long
  • std::intmax_t 呢?
  • 一些网站写了长双...
  • 你的意思是基本数据类型吗?因为你的结构可以随心所欲。
  • 只需look at the existing fundamental types,然后编写一个简单的程序,使用sizeof 来检查大小?这将向您展示 your 系统上 your 编译器的“最大”。

标签: c++ c++11


【解决方案1】:

它(标量类型的最大尺寸)是特定于实现的

你可能有一些奇怪的实现,64 位宽 charsizeof(char)sizeof(int)sizeof(long)sizeof(long long)sizeof(void*) 都为 1。

我不知道 C++11 的这种实现,但我听说 SBCL 上面有一个奇怪的 C99 实现在做类似的事情。我可能错了。

AFAIK,long long 应至少为 64 位宽。而long double 通常比这更宽(但我不知道它是什么标准要求)。

另外,一个实现可以有额外的(和特定的)内置类型,例如_int128_t最近的一些 GCC

如果您关心最大对齐,这是一个稍微不同的问题,请参阅this。 (并且 16 字节在 x86-64 上是一个很好的对齐方式,例如因为 AVX)。

当然,聚合(例如 struct 或数组)可以有相当大的大小(在 GCC 上,比内置类型更大的对齐方式)。

实际最大的聚合大小肯定受到virtual address space 的限制(所以平板电脑或笔记本电脑上只有几千兆字节,如果你足够有钱可以访问一些,则可以达到许多 TB 甚至 PB昂贵的超级计算机)。

但是,call stack实际上通常限制在几兆字节(或者在昂贵的超级计算机上是千兆字节)。所以巨大的数据结构最好分配在堆上(请注意,像std::vector 这样的 STL 容器通常在堆中分配大部分数据,即使容器是局部变量也是如此)。

具体来说,在堆上分配超过几 GB 的连续区域时要小心(这可能会在您的平板电脑上失败)。

【讨论】:

  • sizeof(long long) 和 long long 有区别吗?
  • @BarishNamazov 是的,它们不是一回事吗??
  • @BarishNamazov 你的意思是除了一个是返回大小的表达式,另一个是类型吗?
  • sizeof 是一个编译时运算符,给出了一些size_t 类型的整数常量(例如4 或8 等....),long long 是一个类型。你在比较苹果和酒瓶!
  • 嗯……酒瓶。
【解决方案2】:

我很确定你不能得到比这更大的类型:

struct Big
{
    char buf[static_cast<size_t>(-1)];
};

【讨论】:

  • -1 会更好一些LONG_LONG_MAX
  • struct Bigger { char buf[static_cast&lt;size_t&gt;(-1)]; char more_buf[static_cast&lt;size_t&gt;(-1)]; }; 怎么样,其中size_t 小于uintptr_t...如果可能的话...也许...分段寻址? ... idk,我只是随机取笑。
  • @bolov 好吧,只要sizeof 返回最大值,任何额外的东西都是多余的。
  • 是的,发现这个:A type whose size cannot be represented by std::size_t is ill-formed (since C++14) 这证明你的结构是最大可能的大小,至少从 C++14 开始。 size_t
猜你喜欢
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2016-09-06
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多