是std::array<int,10>(没有我自己使用new)保证在堆栈中分配,而不是由C++ - Standard分配?
要清楚,我不是故意的new std::array<int, 10>.我主要想知道,如果允许标准库new在其实现中使用.
我对内存分配主题进行了测验,这个问题使我感到困惑,因为我对答案不满意。(问题)
正如我已经学会了,我们可以创建一个“ 对象通过创建一个堆上的” 指针变量,使其指向我们在堆(使用分配的内存new关键字)。
对于一个特定的例子:
double* a = new double(-1.0f);
Run Code Online (Sandbox Code Playgroud)
变量 a是一个指针,在堆栈上创建,指向堆上的内存。所以实际上,说a在堆上分配是错误的。我的理解正确吗?
人们谈论堆栈和堆是什么以及它们之间的差异.但我很想知道如果一个CPU不支持堆栈和堆结构,那么C可以在没有堆栈和堆的情况下正常运行吗?
请考虑以下代码,它const以"嵌套"方式将临时对象绑定到引用:
#include <iostream>
std::string foo()
{
return "abc";
}
std::string goo()
{
const std::string & a = foo();
return a;
}
int main()
{
// Is a temporary allocated on the heap to support this, even for a moment?
const std::string & b = goo();
}
Run Code Online (Sandbox Code Playgroud)
我一直试图理解编译器在内存存储方面必须做些什么才能支持这种"嵌套"结构.
我怀疑对于调用foo(),内存分配很简单:std::string当函数foo()退出时,将在堆栈上分配a的存储.
但是,编译器必须做什么来支持所引用的对象的存储b?函数的堆栈goo必须展开并"替换为" b引用的堆栈上的对象,但是为了展开堆栈goo,编译器是否需要在堆上暂时创建对象的副本(在复制之前)它回到不同位置的堆栈)?
或者编译器是否可以完成此构造的要求而不在堆上分配任何存储,即使是暂时的?
或者是它甚至可以将编译器使用相同的存储位置,以由所引用的对象b作为对象由称为a,而不做任何堆栈或在堆上的任何附加配置?
阅读 C++17 草案 §6.9.1/5:
类型
char16_t和char32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_t和uint_least32_t,分别在<cstdint>被称为底层类型。
现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:
typedef 名称
uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。
注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。
是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?