我在2009年首先注意到GCC(至少在我的项目和我的机器上)如果我优化尺寸(-Os)而不是速度(-O2或-O3),则会产生明显更快的代码,我一直想知道为什么.
我设法创建(相当愚蠢)代码,显示这种令人惊讶的行为,并且足够小,无法在此处发布.
const int LOOP_BOUND = 200000000;
__attribute__((noinline))
static int add(const int& x, const int& y) {
return x + y;
}
__attribute__((noinline))
static int work(int xval, int yval) {
int sum(0);
for (int i=0; i<LOOP_BOUND; ++i) {
int x(xval+sum);
int y(yval+sum);
int z = add(x, y);
sum += z;
}
return sum;
}
int main(int , char* argv[]) {
int result = work(*argv[1], *argv[2]);
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果我用-Os它编译它,执行这个程序需要0.38秒,如果用-O2 …
我写了一段C代码,以展示关于优化和分支预测的讨论中的一点.然后我注意到比我预期的更多样化的结果.我的目标是用C++和C之间通用子集的语言编写它,这对于两种语言都是标准兼容的并且相当便携.它在不同的Windows PC上进行了测试:
#include <stdio.h>
#include <time.h>
/// @return - time difference between start and stop in milliseconds
int ms_elapsed( clock_t start, clock_t stop )
{
return (int)( 1000.0 * ( stop - start ) / CLOCKS_PER_SEC );
}
int const Billion = 1000000000;
/// & with numbers up to Billion gives 0, 0, 2, 2 repeating pattern
int const Pattern_0_0_2_2 = 0x40000002;
/// @return - half of Billion
int unpredictableIfs()
{
int sum = 0;
for ( int i = …Run Code Online (Sandbox Code Playgroud) 我对类似主题和与之相关的一些材料进行了一些查询.但我的查询主要是了解下面代码的警告.我不想修复!! 我知道有两种方法,一个联合或使用memcpy.
uint32 localval;
void * DataPtr;
localval = something;
(*(float32*)(DataPtr))= (*(const float32*)((const void*)(&localval)));
Run Code Online (Sandbox Code Playgroud)
请注意以下重点
1.这里涉及的两种类型都是32位.(或者我错了吗?)
2.两者都是局部变量.
编译器具体要点:
1.代码应该是平台无关的,这是一个要求!!
我在GCC编译,它按预期工作.(我可以将int重新解释为浮点数),这就是为什么我忽略了警告.
我的问题
1.编译器在此别名情况下可以执行哪些优化?
2.因为两者都会占用相同的大小(如果不是,请纠正我)这样的编译器优化的副作用是什么?
3.我可以安全地忽略警告或关闭别名吗?
4.如果编译器没有执行优化,我的程序在第一次编译后没有被破坏?我可以安全地假设每次编译器的行为方式都相同(不进行优化)吗?
5.别名是否也适用于void*类型转换?或者它是否仅适用于标准类型转换(int,float等...)?
6.如果禁用别名规则会有什么影响?
编辑
1.基于R和Matt McNabb的更正
2.增加了一个新问题
c casting strict-aliasing compiler-optimization pointer-aliasing
我一直听说确保最佳表现的良好做法是:
int,double...)现在,在编译器下使用C++ 11和完全优化,当通过const引用传递基本类型时是否有开销?
进而,当T是int将以下功能:
template <typename T> inline void f(const T& x);
Run Code Online (Sandbox Code Playgroud)
慢于:
template <typename T> inline void f(const T x);
Run Code Online (Sandbox Code Playgroud) c++ ×3
c ×2
optimization ×2
performance ×2
c++11 ×1
casting ×1
gcc ×1
measurement ×1
x86-64 ×1