gpt4 book ai didi

c++ - 编译时内联内存分配

转载 作者:行者123 更新时间:2023-11-27 23:57:12 24 4
gpt4 key购买 nike

C/C++ 有多种方式在编译时分配内存。例如,我可以添加一个全局或静态变量。存储值的内存是在编译时分配的:

int x;
// -- or --
void f() {
static int y;
}
// -- or --
class C {
static int z;
};
int C::z;

但是这个解决方案不能用于“内联”分配内存。是否有可能在一行中执行类似以下的操作?

static int value_behind_x; // does not need to be "named"
int * const x = &value_behind_x;

我的意思是看起来像这样:

int * const x = static_new int;
// -- or --
int * const x_array = static_new int[10];

我知道 C/C++ 中的一件事允许这样的事情:字符串文字。但是,它们必须是常量,并且不允许将大小指定为数字。

如果没有这样的方式,是否有这样的原因或将来可能会实现?这会很好,因为它可以实现容器的 constexpr 版本,例如 std::vector

最佳答案

Your statementstatic将:

Allocate memory at compile time

这表明是一种误解。 Static Storage Durration定义:

The storage for the object is allocated when the program begins and deallocated when the program ends. Only one instance of the object exists. All objects declared at namespace scope (including global namespace) have this storage duration, plus those declared with static or extern.

了解静态存储持续时间对于解决 "static initialization fiasco" 问题至关重要.

有了这种理解,我们可以看到构建 static 没有性能优势。指向变量的指针,例如 static unique_ptr<const int> x(new int(13)); 而不是只使用 value_behind_x 的地址必要时最好。

同样的事情也适用于分配具有静态存储持续时间的数组。您可以使用类似 array 的容器如果您需要对数组进行容器封装: static array<int, 10> x_array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } 但总的来说, 提供了对范围访问和容器访问的改进。 , , 和 iterator library我只是建议你坚持:

static const x_array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

编辑:

请注意,string literals也有静态存储持续时间,这意味着你不是“在编译时分配的”。实际上只有3 storage durations除了 C++ 使用的静态存储持续时间:

  • Automatic Storage Duration. The object is allocated at the beginning of the enclosing code block and deallocated at the end. All local objects have this storage duration, except those declared static, extern or thread_local.
  • Thread Storage Duration. The object is allocated when the thread begins and deallocated when the thread ends. Each thread has its own instance of the object. Only objects declared thread_local have this storage duration. thread_local can appear together with static or extern to adjust linkage.
  • Dynamic Storage Duration. The object is allocated and deallocated per request by using dynamic memory allocation functions.

所以不,运行前没有分配或初始化。我也不希望出现这种情况,因为这需要对 C++ 意识形态进行根本性的改变某种程度上的计算机架构改变。

关于c++ - 编译时内联内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41722584/

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