C++ 自适应类型推导

C++ adaptive type deduction

最近一直在研究C++的类型推导。在这样做的过程中,我遇到了一些奇怪的事情。当我 运行 此代码时:

#include <iostream>
using namespace std;

int main() {
    auto n = 40;
    auto factorial = 1;

    for(int i = 1; i <=n; ++i)
    {
        factorial *= i;
    }

    cout << "Factorial of " << n << " = " << factorial <<endl;   
    cout << "Size of factorial: " << sizeof(factorial) << endl; 
    return 0;
}

它打印出来:

Factorial of 40 = 0
Size of factorial: 4

所以很明显是缓冲区溢出,所以factorial就是0。但我不明白的是为什么 auto 没有 适应 unsigned long long 之类的东西,为什么它仍然是 int(4 个字节)?有什么办法可以解决这个问题吗?

在C++中,类型只是一个编译时的概念。当你真正开始 运行 程序时,它已经完全忘记了变量是什么类型;它无法在运行时适应。

您最好的办法是使用某种 bignum type,它会根据需要自动增长,但它仍然保持相同的类型。

So its obvious that there was a buffer overflow

乘法结果溢出,但这里没有缓冲区溢出,也就是往缓冲区写入大量数据的时候

why auto didn't adapt to something like a unsigned long long, and why it stayed as an int (4 bytes)? Is there some way to fix this?

1 是一个 int 文字,所以很明显,如果您使用 auto factorial = 1; 它将创建一个 int 变量并为该变量保留固定数量的内存。大小无法更改,因为如果你增加它,它就会被淹没到附近的变量中

如果您想要动态调整大小的功能,那么您可以通过在堆上分配内存来自行处理,就像 std::vectorstd::unordered_map 等容器所做的那样。这需要更多的内存和 CPU 资源,这意味着它们不能应用于基本的 POD 类型,因为它们应该是快速的并且尽可能接近硬件。如果您想要大整数运算,请使用 arbitrary-precision library like GMP or Boost.Multiprecision. Or read the , , , 标签获取更多信息

  • Can we increase the size of data type?