返回信息流1.常量存放在哪个存储区? 到底有没有常量存储区?
2.对于 const int x = 8; x是常量还是一个值不可变的变量?
3.常量的生存期?
这是一条镜像帖。来源:北邮人论坛 / cpp / #92894同步于 2016/7/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于常量的几个问题?
byr10086
2016/7/31镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 byr10086 的大作中提到: 】
: 1.常量存放在哪个存储区? 到底有没有常量存储区?
和实现相关。(比如有时候会放到只读数据区里,有时候是立即数(在代码段),有时候哪里都没有)
: 2.对于 const int x = 8; x是常量还是一个值不可变的变量?
确切地说,是值不可变的变量。实际上,C语言里并没有“变量”这个概念。x是个标识符,它对应int型的存储空间,且这个空间不可变(const)。
: 3.常量的生存期?
不影响,看具体变量。(但一般会优化成永生)
确切地说,C语言的概念模型是这样的:
1. 标识符(identifier)对应存储空间(object,即region of data storage)。
2. 存储空间的声明可以用extern, static, const, volatile, thread_local等修饰符修饰,会影响到它对应的存储空间的生存期。
所谓“生存期”,指的是一段时间。这段时间内,(1)这块存储空间存在,(2)地址不变,而且(3)整个过程中这块存储空间一直有效。
比如,下面的a,b,c,d,e,f,g,h,i这些标识符都对应存储空间:
int a;
long b = 42
const int c = 43;
static int d = 44;
extern long e = 45;
int foo() {
int f = 46;
const int g = 47;
static int h = 48;
}
thread_local int i = 49;
其中,a,b,c,d,e,h对应的存储空间的生存期都是整个程序的执行过程(static生存期),而且只在程序开始执行前初始化一次。其中,abcde是因为是全局变量;h是因为被static修饰了。
f,g的生存期是它所在的块内(auto生存期),而且每次递归地调用foo,都会创建一份f和g的存储空间。
i的生存期是当前线程(thread生存期)。
从C语言语义的角度上来看,const并不会影响生存期。const的意思是:这块存储空间的值不可以变。如果试图改变const的存储空间,就会有“未定义行为”,也就是什么都可以发生,从什么都不发生到机器冒烟都可能发生。这样定义,会使得所有的“修改const存储空间”的行为变得没有意义。这样,编译器就可以做疯狂的优化,比如把g这个auto生存期的存储空间静态地分配。或者干脆不分配内存了(我可没说“存储空间”就是“内存”),直接放到寄存器里,或者用立即数替代,或者编译时进行constant folding。
class Foo {
thread_local std::queue<int> local_queue; // 这个怎么理解,定义一个对象后,不同线程访问,会有不同的local_queue?
thread_safe_queue work_queue;
};
class Foo {
static thread_local std::queue<int> local_queue; // 这个呢?
thread_safe_queue work_queue;
};
【 在 nuanyangyang 的大作中提到: 】
: 确切地说,C语言的概念模型是这样的:
: 1. 标识符(identifier)对应存储空间(object,即region of data storage)。
: 2. 存储空间的声明可以用extern, static, const, volatile, thread_local等修饰符修饰,会影响到它对应的存储空间的生存期。
: ...................
【 在 xiaobing307 的大作中提到: 】
: class Foo {
: thread_local std::queue local_queue; // 这个怎么理解,定义一个对象后,不同线程访问,会有不同的local_queue?
这个不合法。类的成员,除非是static的,否则不能加上thread_local。
: static thread_local std::queue local_queue; // 这个呢?
static成员和全局变量一样。加上了thread_local以后,就是每个线程有且只有一个Foo::local_queue。
: ...................