gpt4 book ai didi

c++ - 为什么 `std::string::reserve()` 没有保留我指定的确切空间量?

转载 作者:太空狗 更新时间:2023-10-29 19:46:06 24 4
gpt4 key购买 nike

std::string::reserve() 没有分配我作为参数传递的确切空间量。例如,如果我尝试为 100 个字符保留空间,它会保留 111 个字符。如果我超过 200,它会预留 207。650 预留 655,1000 预留 1007。

这背后的原因是什么?

程序代码:

std::string mystr;
std::cout << "After creation :" << mystr.capacity() << std::endl;
mystr.reserve(1000);
std::cout << "After reserve() :" << mystr.capacity() << std::endl;
mystr = "asd";
std::cout << "After assignment :" << mystr.capacity() << std::endl;
mystr.clear();
std::cout << "After clear() :" << mystr.capacity() << std::endl;

代码输出:

After creation   :15
After reserve() :1007
After assignment :1007
After clear() :1007

(集成环境:Visual Studio 2012)

最佳答案

标准允许

C++ 标准允许实现预留比请求更多的内存。在标准(N3690,§21.4.4)中指出

void reserve(size_type res_arg=0);

The member function reserve() is a directive that informs a basic_string object of a planned change in size, so that it can manage the storage allocation accordingly.

Effects: After reserve(), capacity() is greater or equal to the argument of reserve. [ Note: Calling reserve() with a res_arg argument less than capacity() is in effect a non-binding shrink request. A call with res_arg <= size() is in effect a non-binding shrink-to-fit request. — end note ]

原因:16字节边界对齐

保留的大小似乎总是一个数字,它是 16 的倍数减去一个空终止字符。堆上保留的内存在 x86 机器上总是自动 16 字节对齐。因此,为内存分配舍入到下一个最大的 16 倍数是没有成本的。

Microsoft documentation for malloc() 指出:

The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object.

Objects of SIMD type必须是 16-byte aligned最好地工作。这些是适合 x86 机器的 128 位寄存器的 4 个 float 或 2 个 double (或其他)的打包类型。如果数据没有正确对齐,那么加载和存储到这些内存位置可能会导致性能大幅下降甚至崩溃。这就是为什么 malloc()做这个。因此得出 16 字节对齐的结论。大多数内存分配(包括 operator new )最终调用 malloc() .不分配 16 字节的倍数只会浪费内存,否则无论如何都不会使用。

关于c++ - 为什么 `std::string::reserve()` 没有保留我指定的确切空间量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17529243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com