C++ if(var=';x';)这样的语句中存储的文本在哪里?
这样说C++ if(var=';x';)这样的语句中存储的文本在哪里?,c++,c,syntax,C++,C,Syntax,这样说 char var; if( var == 'x'); 我们是否首先为“x”分配内存 如果是,它是哪一个(堆栈/数据) 谢谢 值“x”可以作为比较指令的一部分直接存储在代码段中,也可以存储在代码段中用于立即加载到寄存器,或者存储在数据段中用于间接加载或比较。这取决于编译器。几乎每一个针对有能力的体系结构(16位及以上)的编译器都会在CPU指令中设置“x”的常量以进行比较: cmp r0, #'x' 能力较差的体系结构倾向于将这些常量放在常量内存中的一个表中,或者加载它进行比较,或者
char var;
if( var == 'x');
我们是否首先为“x”分配内存
如果是,它是哪一个(堆栈/数据)
谢谢 值“x”可以作为比较指令的一部分直接存储在代码段中,也可以存储在代码段中用于立即加载到寄存器,或者存储在数据段中用于间接加载或比较。这取决于编译器。几乎每一个针对有能力的体系结构(16位及以上)的编译器都会在CPU指令中设置“x”的常量以进行比较:
cmp r0, #'x'
能力较差的体系结构倾向于将这些常量放在常量内存中的一个表中,或者加载它进行比较,或者直接从内存进行比较。对于安装的GCC副本所针对的任何体系结构,这里有一种技术可以回答类似的问题。使用
-S
标志获取适合代码片段的程序集源文件。或者,使用-Wa,-al
获取一个汇编列表,其中显示汇编程序生成的实际字节。比如说,
int foo(char var) {
if (var == 'x')
return 42;
return 17;
}
在我的Windows PC上使用gcc-c-Wa,-al
编译以生成
GAS LISTING C:\DOCUME~1\Ross\LOCALS~1\Temp/ccyDNLLe.s page 1
1 .file "q3715034.c"
2 .text
3 .p2align 4,,15
4 .globl _foo
5 .def _foo; .scl 2; .type 32;
.endef
6 _foo:
7 0000 55 pushl %ebp
8 0001 31C0 xorl %eax, %eax
9 0003 89E5 movl %esp, %ebp
10 0005 807D0878 cmpb $120, 8(%ebp)
11 0009 5D popl %ebp
12 000a 0F94C0 sete %al
13 000d 48 decl %eax
14 000e 83E0E7 andl $-25, %eax
15 0011 83C02A addl $42, %eax
16 0014 C3909090 ret
16 90909090
16 90909090
气体清单C:\DOCUME~1\Ross\LOCALS~1\Temp/ccyDNLLe.s第1页
1.文件“q3715034.c”
2.文本
3.P24,,15
4.环球富
5.def_foo。症状自评量表2。32型;
恩德夫先生
6(吴富):
7 0000 55%推力ebp
80001 31C0 xorl%eax,%eax
9 0003 89E5移动百分比esp,%ebp
10 0005 807D0878 cmpb$120,8(%ebp)
11009 5D popl%ebp
12000A 0F94C0组分%al
13000d 48 decl%eax
14000E 83E0E7和L$-25%,eax
15 0011 83C02A附加42美元,eax%
16 0014 C3909090 ret
16 90909090
16 90909090
管路7和9是功能入口锅炉板的所有剩余部分,管路11和16是功能出口锅炉板。第8行将整个返回值寄存器清除为0。第10行是实际比较
var='x'
,您可以在cmpb$120,8(%ebp)
指令中看到幻数$120
;'x'
的ASCII码是120十进制或0x78十六进制。您可以在偏移量8处的.text段中看到0x78,它作为CMPB指令的一部分存储在该段中。正文的其余部分实现了从我的示例片段中选择返回值,如果比较结果为真,则利用SETE指令使AL
为1,否则为0。其余的指令分别为DECL、和L
,然后根据整个EAX
寄存器中AL
寄存器的初始值生成17或42,该寄存器存储了该体系结构中整数函数的返回值。Anthony回答了实际问题。让我从更语言理论的角度来评论这个问题。C++标准定义文字是RValk表达式,但字符串字符除外,这些字符是数组的LValm表达式。C++标准对对象是什么概念有明确的概念。基本上,对象是具有地址的对象类型(int、double、MyClass等)。但标量类型的纯右值,如char
或double
不被视为对象。它们只是值,不引用内存位置。这包括像'x'
和3.14
这样的文字
编译器存储这些值的方式和位置超出了标准的范围。它甚至不需要直接存储它们。例如,像
x*8
这样的表达式可以转换为汇编代码,将x的值向左移动三位。您是指“x”而不是“b”吗?是的,Jon,很抱歉键入了:-)鉴于您已经很好地列举了各种可能性,我将插入另一个:寄存器。“x”的ASCII值可以(由编译器)知道,由于一些先前执行的代码,它可以方便地存在于寄存器中,或者通过这种预先存在的状态的增量、xor等生成。问题似乎集中在是否可能涉及动态内存分配,甚至可能是数据空间中的静态内存。OP似乎并不关心标准或语言规范。