Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果if语句包含赋值语句,在C语言中会更快吗?_C++_C_Programming Languages - Fatal编程技术网

C++ 如果if语句包含赋值语句,在C语言中会更快吗?

C++ 如果if语句包含赋值语句,在C语言中会更快吗?,c++,c,programming-languages,C++,C,Programming Languages,我正在阅读lcc的源代码,在alloc.c: if ((ap->next = freeblocks) != NULL) { freeblocks = freeblocks->next; ap = ap->next; } 为什么不呢 if (freeblocks != NULL) { ap->next = freeblocks; freeblocks = freeblocks->next; ap = ap->next; } 后者

我正在阅读lcc的源代码,在
alloc.c

if ((ap->next = freeblocks) != NULL) {
   freeblocks = freeblocks->next;
   ap = ap->next;
}
为什么不呢

if (freeblocks != NULL) {
   ap->next = freeblocks;
   freeblocks = freeblocks->next;
   ap = ap->next;
}

后者会导致额外的成本吗?

您发布的代码片段在功能上不完全相同

第一个将
freeblocks
分配给
ap->next
,如果它不是
NULL
,则继续执行其他两个语句

如果freeblocks为
NULL
,则您建议的第二种方法不会将
freeblocks
分配给
ap->next
,并且实际上在这种情况下不起任何作用。这是不一样的

您可以将您的方案更改为以下功能等效的方案:

ap->next = freeblocks;
if (freeblocks != NULL) {
   freeblocks = freeblocks->next;
   ap = ap->next;
}

<>这避免了分配部分的条件,有些人会考虑坏的风格。假设编译时您的意思是执行速度或代码大小,则不太可能导致任何额外的“成本”。

如果您将第二个示例修复为功能相同,例如

ap->next = freeblocks;
if (freeblocks != NULL) {
    freeblocks = freblocks->next;
    ap = ap->next;
}
由于您担心速度,我希望您对编译器进行优化


那么你的问题的答案是:可能不会

性能是优化编译器的设计功能

几年前,我为一家出版商审阅了一本书的手稿,书中作者展示了各种编程技巧(如副作用作业),他声称这些技巧可以产生更快的代码

我在几个编译器上编译了他的版本,结果表明,他的技巧没有一个能产生更快的代码,大多数都会导致代码更慢

您应该始终编写最清晰的代码,并让编译器为您进行优化

if语句中的赋值是一种糟糕的编程实践。使用=而不是==是常见错误。一贯避免副作用分配使这些错误更容易发现

你在翻译中的错误说明了原始代码是多么的不清楚。这种糟糕的代码通常来自汇编语言程序员

您的修订版字面上翻译成如下内容(我的伪汇编代码)

而原文的直译更像:

MOV  freeblocks, next(R0)
JUMPNE TEST
大多数系统测试零作为移动指令的一部分。从理论上讲,原始版本缩短了一条指令

但是,任何优化编译器都将足够聪明,可以删除冗余测试


编码以超越编译器是浪费时间、精力和清晰度。

相同的代码是先完成赋值,然后进行检查。关于这个问题(假设固定的等效代码):我相当肯定这只是一种风格。不,它不是更快。这主要是一种风格选择。您已经用两种方式编写了代码。现在两种方式运行,很快你就会知道哪个更快。@ EricLippert哈哈,你是对的。BTW:在NC和C++中,与NULL的显式比较被认为是坏的风格,因为它是多余的。@去复印机:我认为它是好的风格,因为它更清楚地捕捉程序员的意图。记住,少量冗余是好的,因为它有助于理解。那么,为什么不添加另一个呢!=0 ? 还是您来自java?@Deduplicator:我认为,避免这种比较是惯用的C/C++,而不是最佳做法。是否更可取取决于您的团队。有些人不喜欢C/C++允许使用数字和指针(与显式布尔值相反),他们更喜欢将这种比较(即与0/NULL的比较)显式化。另一方面,如果你开始谈论显式布尔值,一些C/C++程序员会觉得你很可笑。因此,你反对使用惯用C/C++,因为它不支持不存在的独特布尔类型?是的,c获得了(在c++之后很久)一种专用的布尔类型,但在十多年后它仍然萎靡不振,因为它从来都不需要。无论如何,您需要理解c/c++的真实性概念并编写代码。
MOV  freeblocks, next(R0)
JUMPNE TEST