- 论坛徽章:
- 0
|
>>类属数据成员不占用类实例的存储空间,它是在编译期就可以确定的
>>而实例数据成员,只有在创建类的实例后才存在,这是个运行期的概念--只有在程序执行后.
>>这二句话是什么意思呀?跟可执行文件中的.text,.bss段有关系吗?
.text一般是指代码段,.bss即未初始化数据段.
c语言里,对于静态和外部变量,都是存放在数据段内的.在编译完成,生成目标文件后,在目标文件里,就已经为其保留了空间,或者为其设置了初始化值,或者在程序被loader载入时,初始化为0--所以我说它是个编译期的概念,因为在编译完成后,就可以认为该变量已经存在了,它已经占据了存储空间了.
还有一种在堆栈内或是在堆里面分配的变量,这种变量只有在程序执行时,执行到该函数内部,通过调整堆栈指针来分配空间并进行初始化等操作,这一切都是在程序成为进程运行时才得以实现的,所以说它是个运行期的概念.
- class Object
- {
- private:
- static int sharedValue;
- int instanceValue;
- };
- 被编译器逻辑处理为
- struct Object
- {
- int instanceValue;
- }; // 每个Object类的实例(无论它创建于堆栈还是堆还是数据段)均有其各自独立的instanceValue值,所以称其为实例变量
- static int sharedValue; // 所有Object的实例(哪怕根本没有创建对象也存在)所共享的,因为它实际上就相当于一个全局变量.
- static const int SIZE = 100;
- 通过static使编译器将其分配在数据段--在编译完成就分配存储空间,通过使用const告诉编译器这是一个常量,可用于
- const int ARRAY_SIZE = 100;
- int array[ARRAY_SIZE];这样的语法里.
- 我让你比较尺寸的目的就是让你了解类属成员不占用类实例的存储空间,从而了解这种存储分配的布局情况.
复制代码
>>偶之前一段代码,用枚举替换了类里的static const int后,
>>生成的可执行文件大小,由46K降到了26K
c++里面的const默认采用的是internal linkage(除非你加extern声明).可能编译器做的是为你的每个使用该常量的编译单元产生了一份该常量的拷贝.你用nm检查一下目标文件看一下,看如果有该符号的话,看它是"U"还是其它什么的--如果是"U"表示它是存在与外部的某个目标文件里,如果是其他的,那么编译器应当是生成拷贝了--因为他是个const.
enum默认采用的是external linkage. |
|