对于c++中“常量折叠”的几点疑问(没有帖子问过的问题)

greatm 2007-10-16 01:49:13
c++里的常量折叠(或者常量替换)是将const常量放在符号表中,而并不给其分配内存。编译器直接进行替换优化。
下面是一个cpp文件:
#include 。。。。
const int i =1;
int main()
{
const int j = 2;
printf("%d,%d",i,j);
return 1;
}

那么:
(1)符号表本身是存在哪里的?是数据段里吧?
(2)我要强行取这个变量的地址的时候,比如:
const int *pi = &i;
const int * pj = &j;
这时i和j应该都会被分配内存吧?
那么i分配的内存是在数据段,J被分配的内存是在栈中,这对吗?
(3)我就知道c语言的const常量是要分配内存的。如果在c语言中同样有上面这么一段程序,那么i,j分别在哪里分配内存?

(4)c语言有“常量折叠”这样的优化吗?

(5)如果有,进行常量折叠优化时,这个const常量的值是放在寄存器中,每次都从寄存器中取其值?
还是跟c++一样,将其放在符号表中,编译器在编译时进行“替换”优化?
...全文
125 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdoupanguoqing 2007-10-17
  • 打赏
  • 举报
回复
#define MAX_NUM1 1 //编译时替换
const int MAX_NUM2 = 2 //运行时传值,调试的时候可以看到是有地址的
星光伴月 2007-10-17
  • 打赏
  • 举报
回复

#include <iostream >
using namespace std;

int main(void)
{
const int a=10;
int * p = (int*)&a;//为了能尝试通过*p修改常量a的值,用了强制转换

cout < <"a = " < < a < <endl; //输出 a = 10
cout < <"*p= " < <*p < <endl; //输出 *p = 10
*p=100; //试图修改a的值
cout < <"a = " < < a < <endl; //仍然输出: a = 10
cout < <"*p= " < <*p < <endl; //这里却输出: *p = 100

system("pause");
}


以下是 cout < <"a = " < < a < <endl;
这一句在DEBUG时的汇编代码:
004114DB mov esi,esp
004114DD mov eax,dword ptr [__imp_std::endl (41A344h)]
004114E2 push eax
004114E3 mov edi,esp
004114E5 push 0Ah ;;;;;;;注意这里是个10,是个立即数
004114E7 push offset string "*p=" (417704h)
004114EC mov ecx,dword ptr [__imp_std::cout (41A348h)]
004114F2 push ecx
004114F3 call std::operator < < <std::char_traits <char > > (411159h)
004114F8 add esp,8
004114FB mov ecx,eax
004114FD call dword ptr [__imp_std::basic_ostream <char,std::char_traits <char > >::operator < < (41A34Ch)]
00411503 cmp edi,esp
00411505 call @ILT+410(__RTC_CheckEsp) (41119Fh)
0041150A mov ecx,eax
0041150C call dword ptr [__imp_std::basic_ostream <char,std::char_traits <char > >::operator < < (41A32Ch)]
00411512 cmp esi,esp
00411514 call @ILT+410(__RTC_CheckEsp) (41119Fh)
BluntBlade 2007-10-16
  • 打赏
  • 举报
回复
不需要关心这种问题。如果你关心,请修改设计。
healer_kx 2007-10-16
  • 打赏
  • 举报
回复
当然会优化了,但是还是会为其分配内存的,应该在数据区。你可以修改其值,但是编译器的做法通常在编译期就进行了“宏一样”的替换,以保证常量的语意。

比如
const int i = 5;
*const_cast<int*>(&i) = 6;

cout<<i<<endl; 出来的还是5, 但是你实际看内存的值已经是6了。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧