pra*_*pin 0 c c++ optimization
C和C++标准规定执行顺序必须严格遵循源指令顺序.编译器可以按任何顺序自由地评估指令中的子表达式,但不能重新排序用分号或冒号分隔的指令.
例如,在指令中:
A = A + B * C + D * E;
Run Code Online (Sandbox Code Playgroud)
编译器可能选择在B*C之前执行D*E,或者在结尾添加A.
如果现在将相同的计算拆分为各种指令:
int t1 = B * C;
t1 += D * E;
A += t1;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器无法在B*C之后评估D*E.
通常,这种代码稍微慢一点,因为编译器无法优化特定硬件的CPU指令的顺序.
我想做的是相反的方式.例如,如果展开的循环的主体读取:
A[0] = B[0] * C[0];
A[1] = B[1] * C[1];
A[2] = B[2] * C[2];
A[3] = B[3] * C[3];
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉编译器这四条指令可以按任何顺序进行评估,因为它们对不同的数据进行操作?即使是非便携式技巧也是受欢迎的.
C和C++标准规定执行顺序必须严格遵循源指令顺序.
不完全的.他们说,程序的可观察行为 - 即I/O操作和对易失性对象的访问 - 必须发生,就好像这样.编译器仍然可以自由地重新排序评估,只要它不会改变程序的行为.只要您的赋值和乘法运算没有可观察到的副作用,您的代码就可以重新排序.
但是,当您使用指针或引用时,事情会更成问题.一般情况下,编译器不能告诉A,B并C指向的内存不同的区域,所以它必须假定的分配A可能会改变的一个B或C更高版本中使用的值.因此,它无法重新排序评估.在C中,您可以使用restrict告诉编译器它们不重叠,但标准C++中不存在这样的功能.(如果它们是数组,这不是问题,在这种情况下,编译器知道它们不重叠.)