c++ - 除了内容(例如类型、位置)之外,变量是否还消耗内存?

标签 c++ c

很可能之前已经有人问过/回答过这个问题,但不确定如何用最好的措词来表达它,如果有一个指向以前回答过的问题的链接会很好。

如果你定义类似的东西

char myChar = 'a';

我知道这将占用内存中的一个字节(取决于实现并假设没有 unicode 等,实际数字并不重要)。

但我假设编译器/计算机还需要保留一个变量类型、地址(即指针)和可能更多的表。否则它会保留内存,但不能用它做任何事情。因此,每个变量至少已经消耗了几个字节的内存。

这是对发生的事情的正确描述,还是我误解了程序编译/执行时发生的事情?如果以上是正确的,那么它更多地与编译有关,还是与执行有关?

最佳答案

编译器 将跟踪变量的属性 - 它的名称、生命周期、类型、范围等。此信息仅在编译期间存在于内存中。然而,一旦程序被编译并执行,剩下的就是对象本身。在运行时没有类型信息(除非您使用 RTTI ,否则会有一些,但这只是因为您需要它才能让您的程序运行 - 例如 dynamic_casting ).

访问对象的代码中发生的所有事情都被编译成一种形式,将其完全视为单个字节(因为它是一个char)。对象所在的地址无论如何只能在运行时知道。然而,具有自动存储持续时间的变量(如局部变量)通常仅通过当前堆栈帧的一些固定偏移量定位。该偏移量被硬烘焙到可执行文件中。

关于c++ - 除了内容(例如类型、位置)之外,变量是否还消耗内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883566/

相关文章:

c - 避免在 C 程序中使用 main(入口点)

c++ - 如何在另一个类中初始化我的对象数组

c++ - 使用宏扩展作为标识符的一部分

数一下总数文件中的关键字

c++ - char * arr[5] = {...} 上的访问冲突,这是什么?

c - 正交相机投影矩阵

c - 如何在 Windows XP 中以编程方式打开或关闭鼠标过滤器

C++:使用继承的类的内存布局

c++ - QML 指针处理程序和处理抓取更改

C++:调试 C++ 模板链接器错误