我知道 max_size() 中的 std::allocator 是一个理论上的限制,但我只是尝试了一些东西,我得到的数字非常大;那么我应该如何解释这个数字以及这个函数背后的哲学是什么?

我的例子:

#include <iostream>
#include <memory>
#include <cstdint>
typedef int8_t Tnum_1;
struct X
{
    template <typename T>
    static void printAllocInfo()
    {
        std::cout << std::allocator<T>().max_size() << "\t Alloc max_size\n";
        std::cout << ((std::allocator<T>().max_size()) / (1024))
                  << "\t Alloc max_size / 1024\n";
        std::cout << (((std::allocator<T>().max_size()) / (1024)) / (1024))
                  << "\t\t Alloc max_size / 1024 / 1024\n";
    }
};
int main()
{
    X::printAllocInfo<Tnum_1>();
    return (0);
}

它打印:
18446744073709551615     Alloc max_size
18014398509481983        Alloc max_size / 1024
17592186044415           Alloc max_size / 1024 / 1024

并考虑到我只是使用 int8_t 作为模板参数,这意味着我可以在我的机器上分配 18446744073709551615 bytes 吗?这个数字太大了,它开始失去任何实际意义。

最佳答案

您引用的那个数字当然是 2^64 -1,也就是可以表示的最大 64 位无符号整数。所有 max_size() 表示它不支持任何更大的东西,而不是它支持低于该大小的所有东西。

由您的操作系统实际将其提供给您的程序。但是由于您可以在运行它的不同机器上编译程序(包括遥远 future 的机器),因此没有理由将 max_size() 限制为较小的数字。

注意 :如果您阅读 表 31 — C++ 标准中的分配器要求 ,您会发现 a 类型的分配器对象 X 的以下内容:



所以 max_size 是可以分配的最大对象数,而不是字节数。

关于c++ - std::allocator::max_size() 背后的原理是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22183162/

10-09 08:57