gpt4 book ai didi

c++ - 放置 new[] 的开销

转载 作者:可可西里 更新时间:2023-11-01 17:58:10 32 4
gpt4 key购买 nike

当前标准草案明确states该位置 new[] 可能有空间开销:

This overhead may be applied in all array new-expressions, including those referencing the library function operator new[](std​::​size_­t, void*) and other placement allocation functions. The amount of overhead may vary from one invocation of new to another.

所以大概他们心里有数,为什么编译器需要这种开销。它是什么?编译器能否将此开销用于任何有用的事情?

据我所知,要销毁这个数组,唯一的解决方案是在循环中调用析构函数(我说得对吗?),因为没有位置 delete[](顺便说一句,应该'我们有放置 delete[] 来正确地破坏数组,而不仅仅是它的元素?)。因此编译器不必知道数组长度。

我认为由于这种开销不能用于任何有用的事情,编译器不会使用它(所以这在实践中不是问题)。我用这个简单的代码检查了编译器:

#include <stdio.h>
#include <new>

struct Foo {
~Foo() { }
};

int main() {
char buffer1[1024];
char buffer2[1024];

float *fl = new(buffer1) float[3];
Foo *foo = new(buffer2) Foo[3];

printf("overhead for float[]: %d\n", (int)(reinterpret_cast<char*>(fl) - buffer1));
printf("overhead for Foo[] : %d\n", (int)(reinterpret_cast<char*>(foo) - buffer2));
}

GCC 和 clang 根本不使用任何开销。但是,MSVC 在 Foo 情况下使用 8 个字节。 MSVC 可以出于什么目的使用此开销?


这里有一些背景,我为什么提出这个问题。

之前有关于这个主题的问题:

据我所知,这些问题的寓意是避免使用放置 new[],并在循环中使用放置 new。但是此解决方案不会创建数组,而是创建彼此相邻的元素,不是数组,使用 operator[] 对它们来说是未定义的行为。这些问题更多是关于如何避免放置 new[],但这个问题更多是关于“为什么?”。

最佳答案

Current draft standard explicitly states ...

澄清一下,这条规则(可能)自标准的第一个版本以来就存在(我可以访问的最早版本是 C++03,它确实包含该规则,而且我没有发现需要添加该规则的缺陷报告).

So presumably they have something in mind, why a compiler need this overhead

我怀疑标准委员会并没有考虑任何特定的用例,而是添加了规则以使现有的编译器与此行为兼容。

For what purpose could MSVC use this overhead? "why?"

这些问题只有 MS 编译器团队才能自信地回答,但我可以提出一些猜想:

调试器可以使用该空间,这将允许它显示数组的所有元素。地址 sanitizer 可以使用它来验证数组是否溢出。也就是说,我相信这两种工具都可以将数据存储在外部结构中。

考虑到开销仅在非平凡析构函数的情况下保留,可能是用来存储到目前为止构造的元素数量,以便编译器可以知道在发生异常时销毁哪些元素在其中一个构造函数中。同样,据我所知,这也可以存储在堆栈上的一个单独的临时对象中。


就其值(value)而言,Itanium C++ ABI 同意不需要开销:

No cookie is required if the new operator being used is ::operator new[](size_t, void*).

其中cookie指的是数组长度开销。

关于c++ - 放置 new[] 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356882/

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