你好,
我想知道这些任务中哪一项更快、更安全、更好等,可能是为什么:
int choice = fgetc(stdin);
unsigned int bSize;
choice = fgetc(stdin)
1:
bSize = (choice == 'y' || choice == 'Y') ? 256 : 128;
2:
bSize = 128 + ((choice == 'y' || choice == 'Y') << 7);
谢谢。
你好,
我想知道这些任务中哪一项更快、更安全、更好等,可能是为什么:
int choice = fgetc(stdin);
unsigned int bSize;
choice = fgetc(stdin)
1:
bSize = (choice == 'y' || choice == 'Y') ? 256 : 128;
2:
bSize = 128 + ((choice == 'y' || choice == 'Y') << 7);
谢谢。
关于速度,这至少与选择 2 一样快:
bSize = 128 << (choice == 'y' || choice == 'Y');
这是否比选择 1 更快对我来说并不是很明显。但是,为了在未知平台上调整性能,我认为我喜欢选项 2 的建议变体。原因是,在硬件级别,选项 2(原始或变体)不涉及重新加载程序计数器,而是调用相对简单的移位寄存器操作,涉及的晶体管相对较少。(实际上,如果您想获得真正的技术性,我可以理解这种转变可能是通过多路复用来完成的。 详细地说,这对于目前的格式来说太过分了,但关键是输出(choice == 'y' || choice == 'Y')
是有效的管道直接到多路复用器的控制线之一。反正真的很快。)
关于是否可以按照建议的方式安全地使用评估条件,ISO/IEC 9899:1999 (E),第 1 节。6.5.14.3,保证可以安全地做到这一点。其内容为:“|| 如果任一操作数比较不等于 0,则 || 运算符将产生 1;否则,将产生 0。结果的类型为 int。”
(@PaulR 正确地观察到,像这个答案提供的那些电子理论考虑并不是决定性的。必须在实际平台上分析实际代码才能确定哪个更快。这也不仅仅是 @PaulR 的狡辩。它是可以说选择 2会更快,但这并不意味着更快。根据使用的 CPU,分支预测或其他硬件可能会提升选择 1,如果确实如此,我也不会感到非常惊讶。)
在我看来,“选择 1”“更快”,因为在比较之后只完成了一次赋值操作。在“选择 2”中,它执行“+”和“<<”以及比较部分。'Choice 1' 是 'safer' 因为它比其他选择更具可读性,因此程序员在编写它时出错的机会更少。由于前两个原因,选择 1“更好”。