例如,以下是两种设置整数变量的方法(比如C ++):
int x = 0xFF;
int y = 255;
哪个语句编译可以更快地将实际位设置为整数值?
已编辑:*编译已从执行更改。我假设转换为二进制是在执行时,但似乎在编译时给定@ muntoo的答案
答案 0 :(得分:8)
执行时间完全没有区别,编译速度可能没有差别。
添加以回复评论:
这是发生了什么。编译器有一个解析器,可能是递归下降的,在底部调用一个词法分析器来获取令牌。在这种情况下,=
之后的标记是一个数字,它可以通过前导数字来表示,所以它就是这样的,其中pc
是指向当前字符的指针:
if (isdigit(*pc)){
intpart = 0;
if (pc[0]=='0' && pc[1]=='x'){
pc += 2;
while(ishexdigit(*pc)){
intpart *= 16;
if (isdigit(*pc)){
intpart += (*pc - '0')
}
else {
intpart += (tolower(*pc) - 'a' + 10);
}
pc++;
}
}
else {
while(isdigit(*pc)){
intpart *= 10;
intpart += (*pc - '0');
pc++;
}
if (*pc == '.'){
// ... handle fractional part
}
}
}
无论如何,正如您所看到的,这是一个非常紧凑的循环,对于数字中的每个字符,isdigit
或ishexdigit
或tolower
执行一次或两次,乘法,减法和加成。假设这些函数是在线的,我们说每个字符可能有10-20条指令。
在十六进制情况下,每个字符可能稍微多一些指令,但十进制数字会有更多的字符,所以很难说 a-priori 哪个应该更快。
这只发生在您有能力在代码中输入的此类整数的总数,例如大约100。
如果机器每秒可以执行10 ^ 8条指令,它可以以大约10 ^ 7每秒的速率读取数字,或者每个字符大约100纳秒,或者对于文件中的所有数字都是10微秒,给出或需要一个数量级。
一旦编译器知道它是一个数字,它就会成为抽象语法树的一部分,它用于生成汇编语言。到那时,它是十六进制或十进制的事实早已被遗忘。它只知道它是某个值的二进制整数,所以汇编语言是相同的。
答案 1 :(得分:3)
0xFF
与255
相同。两者都将生成完全相同的代码。您的编译器将它们“转换”为11111111b
。
编译速度全部取决于编译器及其编译方式。
例如,0xFF
可以被识别为十六进制数字(忽略正则表达式,这将是首选方法):
bool myishex(string sz)
{
if(sz[0] == '0' && sz[1] == 'x')
{
for(size_t i = 2; i < sz.length(); ++i)
if(!(sz[i] >= '0' && sz[i] <= '9') || !(sz[i] >= 'A' && sz[i] <= 'F') || !(sz[i] >= 'a' && sz[i] <= 'f'))
return(false);
}
else
{
return(false);
}
return(true);
}
与myisnum()
相比:
bool myisnum(string sz)
{
for(size_t i = 0; i < sz.length(); ++i)
if(!(sz[i] >= '0' && sz[i] <= '9'))
return(false);
return(true);
}
嗯,myisnum()
通常比myishex()
快。 (A-F
或a-f
的概率高于0-9
。)
但是从FF
到二进制数的转换可能比<{1}} 更快。
255
虽然你没有得到十进制到二进制的位移,但你也没有得到int myhex2bin(string sz)
{
int b = 0;
sz = sz.substr(2); // Cut the "0x" out.
for(size_t i = 0; i < sz.length(); ++i)
{
sz[i] = tolower(sz[i]);
b += myhexdigit2dec(sz[i]) << ((sz.length() - (i + 1)) << 2);
}
return(b);
}
// Unsafe. Optimized for speed.
int myhexdigit2dec(char c)
{
return(c < 'A' ? c - '0' : (c < 'a' ? c - 'A' + 10 : c - 'a' + 10));
}
和A-F
。
a-f
结论:仍取决于编译器,但int mydec2bin(string sz)
{
int b = 0;
int factor = 1;
for(size_t i = sz.length(); i > 0; --i)
{
b += (sz[i - 1] - '0') * factor;
factor *= 10;
}
return(b);
}
可能编译速度更快。 :)