Tag: 编译器优化

“volatile”限定符和编译器重新排序

编译器不能消除或重新排序对volatile限定变量的读/写。 但是,存在其他变量的情况又如何,可能是也可能不是volatile ? 情景1 volatile int a; volatile int b; a = 1; b = 2; a = 3; b = 4; 编译器可以重新排序第一个和第二个,第三个和第四个赋值吗? 场景2 volatile int a; int b, c; b = 1; a = 1; c = b; a = 3; 同样的问题,编译器可以重新排序第一个和第二个,或第三个和第四个分配?

powfunction在这里发生了什么?

我在这里看到了各种答案,描述了C函数中的pow函数的奇怪行为。 但我在这里问一些不同的东西。 在下面的代码中,我初始化了int x = pow(10,2)和int y = pow(10,n) (int n = 2) 。 在第一种情况下,当我打印结果时,它显示100而在另一种情况下,它显示为99 。 我知道pow返回double并且在int存储时会被截断,但我想问为什么输出会有所不同。 CODE1 #include #include int main() { int n = 2; int x; int y; x = pow(10,2); //Printing Gives Output 100 y = pow(10,n); //Printing Gives Output 99 printf(“%d %d” , x , y); } Output : 100 […]

在clang中,您如何使用每个函数的优化属性?

我正在尝试使用clang编译一个没有优化的特定函数,以防止某些与memset()相关的安全相关调用被优化掉。 根据可在此处找到的文档,存在一个允许这样的optnone属性。 此外, 这里可以找到一个例子 。 不幸的是,(至少在下面的clang版本上,在OS X 10.9.5上),这会导致编译器警告,如下例所示: $ clang –version Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix $ cat optnone.c #include __attribute__((optnone)) void* always_memset(void *b, int c, size_t len) { return memset(b, c, len); } $ clang -Wall -O3 -c -o optnone.o optnone.c optnone.c:3:16: warning: unknown attribute […]

LTO,虚拟化和虚拟表

比较C ++中的虚函数和C中的虚拟表,一般编译器(以及足够大的项目)在虚拟化方面做得很好吗? 天真地看来,C ++中的虚函数似乎有更多的语义,因此可能更容易进行虚拟化。 更新: Mooing Duck提到了内联的虚拟化function。 快速检查显示错过的虚拟表优化: struct vtab { int (*f)(); }; struct obj { struct vtab *vtab; int data; }; int f() { return 5; } int main() { struct vtab vtab = {f}; struct obj obj = {&vtab, 10}; printf(“%d\n”, obj.vtab->f()); } 我的GCC不会内联f,虽然它是直接调用的,即,虚拟化。 C ++中的等价物, class A { public: virtual int […]

C中的浮点运算是关联的吗?

加法在数学上保持关联属性: (a + b) + c = a + (b + c) 在一般情况下,此属性不适用于浮点数,因为它们表示有限精度的值。 作为优化的一部分,是否允许编译器在从C程序生成机器代码时进行上述替换? 它在C标准中的确切位置在哪里?

字符串文字的C优化

刚刚在gdb中检查以下内容: char *a[] = {“one”,”two”,”three”,”four”}; char *b[] = {“one”,”two”,”three”,”four”}; char *c[] = {“two”,”three”,”four”,”five”}; char *d[] = {“one”,”three”,”four”,”six”}; 我得到以下内容: (gdb) pa $17 = {0x80961a4 “one”, 0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”} (gdb) pb $18 = {0x80961a4 “one”, 0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”} (gdb) pc $19 = {0x80961a8 “two”, 0x80961ac “three”, 0x80961b2 “four”, 0x80961b7 “five”} (gdb) […]