c++中不同程序元素的大小

Size of different program elements in C++

本文关键字:元素 程序 c++      更新时间:2023-10-16

内存何时分配给数据类型,类和函数?在声明的时候还是在定义的时候?

也有一种方法来知道函数的大小?

c++中不同程序元素的大小

内存何时分配给数据类型,类和函数?在声明的时候还是在定义的时候?

数据类型只是编译器理解的抽象概念。当需要这种类型的变量时,必须分配内存。:

  • 内存量-在编译时使用sizeof 操作符(它不是一个函数)-由编译器决定:对于内置类型,它是固定的基于它们的二进制表示,对于用户定义类型,它基本上是一个"递归的";数据成员的单独尺寸之和(调整为对齐/打包)

  • 实际地址可在以下位置确定:

    • 编译时间(通常是全局变量和static变量)[详细信息见注释]
    • 运行时(对于堆分配变量),
    • 以混合运行-时间-堆栈-帧相对方式用于局部变量
    • 在加载时或以相对于base-address的方式(对于动态加载库中的global/extern/static符号)。

类是用户定义的数据类型,并遵循同样的规则,虽然为类的大小是未知的,如果声明已被编译器,但进一步定义为源代码:直到编译器认为它不能定义计算对象的大小,你可以利用非常有限的类标识符——创建指针和引用,指向一个实例,而不是实际的变量类型。

还有什么方法可以知道函数的大小?

是一个操作符,它注入编译器计算出的编译时常量大小值。因此,在编译器生成的任何机器码对象中都没有sizeof函数。

内存在定义时分配,例如

(省略头结构)

  • In foo.h: extern int bar; - declaration

  • foo.cpp: int bar = 0; -definition

声明让编译器"知道"变量/类/函数的存在,而定义实际上是"定义"了变量/类/函数。

sizeof()操作符的实现依赖于编译器和实现——没有简单的方法可以找到它的实现。

  1. 所有的auto变量在程序流进入其作用域时被分配。全局变量也遵循这一规则。所有这些都是在程序启动时分配的。
  2. 无法确定函数的实际大小。在汇编级别上,你的函数可能被编译器分解成许多部分。你的函数代码也可能包含其他内联函数。

问题的答案如下:

  1. 定义(对于函数它取决于函数的种类,如果它是一个延迟加载DLL文件例如,也许当DLL文件被加载时)

  2. 没有

变量在进入作用域时被分配。没有sizeof(函数),分配的内存属于堆。