c++中不同程序元素的大小
Size of different program elements in C++
内存何时分配给数据类型,类和函数?在声明的时候还是在定义的时候?
也有一种方法来知道函数的大小?
c++中不同程序元素的大小
内存何时分配给数据类型,类和函数?在声明的时候还是在定义的时候?
数据类型只是编译器理解的抽象概念。当需要这种类型的变量时,必须分配内存。:
-
内存量-在编译时使用
sizeof
操作符(它不是一个函数)-由编译器决定:对于内置类型,它是固定的基于它们的二进制表示,对于用户定义类型,它基本上是一个"递归的";数据成员的单独尺寸之和(调整为对齐/打包) -
实际地址可在以下位置确定:
- 编译时间(通常是全局变量和
static
变量)[详细信息见注释] - 运行时(对于堆分配变量),
- 以混合运行-时间-堆栈-帧相对方式用于局部变量
- 在加载时或以相对于base-address的方式(对于动态加载库中的global/extern/static符号)。
- 编译时间(通常是全局变量和
类是用户定义的数据类型,并遵循同样的规则,虽然为类的大小是未知的,如果声明已被编译器,但进一步定义为源代码:直到编译器认为它不能定义计算对象的大小,你可以利用非常有限的类标识符——创建指针和引用,指向一个实例,而不是实际的变量类型。
还有什么方法可以知道函数的大小?
是一个操作符,它注入编译器计算出的编译时常量大小值。因此,在编译器生成的任何机器码对象中都没有sizeof
函数。
内存在定义时分配,例如
(省略头结构)
-
In
foo.h
:extern int bar;
- declaration -
foo.cpp
:int bar = 0;
-definition
声明让编译器"知道"变量/类/函数的存在,而定义实际上是"定义"了变量/类/函数。
sizeof()
操作符的实现依赖于编译器和实现——没有简单的方法可以找到它的实现。
- 所有的auto变量在程序流进入其作用域时被分配。全局变量也遵循这一规则。所有这些都是在程序启动时分配的。
- 无法确定函数的实际大小。在汇编级别上,你的函数可能被编译器分解成许多部分。你的函数代码也可能包含其他内联函数。
问题的答案如下:
-
定义(对于函数它取决于函数的种类,如果它是一个延迟加载DLL文件例如,也许当DLL文件被加载时)
没有
变量在进入作用域时被分配。没有sizeof(函数),分配的内存属于堆。
- Mongodb c++驱动程序:如何查询元素的数组
- 为什么使用数组元素查找最大数字的程序不起作用?
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 程序来检查两个数组的相似元素
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 需要帮助编写一个小程序来将循环乘以 n 个元素和 k 个多重性
- 我的程序只输出 1 的最高元素
- 如何从C++程序中检索 DOM 元素?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- C++程序在迭代到数组的最后一个元素时崩溃
- 内部源代码 - 在链接列表实现中插入元素上的删除会破坏整个应用程序
- 如何创建一个带有链表的程序,该链表会破坏第 n 个元素
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当矢量有 6 个元素(C++、矢量、循环)时,程序打印异常数字
- 程序必须将奇数索引元素放在新的向量 C 中,将偶数索引元素放在另一个向量 T 中
- 将元素添加到列表会使程序崩溃..有时
- C++:指向对象的指针数组 - 删除元素时程序崩溃>
- 通过ARM NEON程序集最大限度地优化元素乘法
- 为什么我的程序在8192个元素上循环时速度很慢