来自维基百科上的优化编译器 , 编译器优化通常使用一系列优化转换来实现 ,这些算法采用程序并对其进行转换以生成使用较少资源的语义上等效的输出程序。 和GCC有很多优化选择。 我想在使用不同的标志(如-O1 , -O2 , -O3等)进行编译时执行每次优化后,研究生成的程序集(一个-S给出)。 我怎样才能做到这一点? 编辑:我的输入将是C代码。
以下代码工作正常: #include #include int main() { struct node{ int a, b, c, d, e; }; struct node *ptr = NULL; printf(“Size of pointer ptr is %lu bytes\n”,sizeof (ptr)); printf(“Size of struct node is %lu bytes\n”,sizeof (struct node)); ptr = (struct node*)malloc(sizeof (ptr)); //Line 1 // ptr = (struct node*)malloc(sizeof (struct node)); //Line 2 ptr->a = […]
这部分gcc手册非常模糊,我无法理解重复尝试后forceinline属性的用法。 我正在定义一个对象和某些函数来操纵该对象。 这些函数中很少有可以使用primefaces指令,我希望编译器内联这些函数。 但是我不想在头文件中编写这些函数,并在linux内核中使用“static inline”声明它们。 有没有办法强制gcc从另一个翻译单元内联函数?
考虑以下简短的C程序: #include #include #define K 20 // int K = 20; int main() { printf(“%f\n”, sqrt(K)); } 这个程序,如给定的,用gcc Foo.c编译,并产生正确的输出。 但是,如果我们注释掉#define行,并在int K = 20行中注释,那么我们得到一个undefined reference to sqrt’的编译时错误,这只能通过使用gcc Foo.c -lm进行编译来修复。 。 我在Ubuntu 13.04上的gcc 4.7.3 。
当我用gcc -Wall -pedantic -ansi -std=c89编译下面的代码时,它成功编译而没有在指针赋值时给出错误。 请注意,我将int (*)[4]为int (*)[] 。 int arr[4]; int (*p_arr)[] = &arr; 假设有一些理由允许这个(不兼容的?)赋值,当我尝试使用它时,编译器会给出不完整的类型错误error: invalid application of ‘sizeof’ to incomplete type ‘int[]’ 。 (void) sizeof(*p_arr); 这个错误让我想到允许前一个指针赋值p_arr = &arr的用途是什么? 是否按照标准允许此分配? 我使用了不完整的struct / union类型(通常用于前向声明),并且还遇到了错误incomplete array element type 。 但这种incomplete array type对我来说是新的。 是否有可能在C标准中有一个用例?
我正在尝试使用SSE内在函数来优化我的代码但是我遇到了一个问题,在我完成SSE内在函数操作以获得我想要的东西后,我不知道从向量中提取整数值的好方法。 有谁知道这样做的好方法? 我用C编程,我的编译器是gcc版本4.3.2。 感谢你的帮助。
我注意到c11上的M_PI不可用。 通过查看/usr/include/math.h我可以看到M_PI定义如果: #if !defined(__STRICT_ANSI__) || ((_XOPEN_SOURCE – 0) >= 500) … #define M_PI 3.1415… #endif 另外在math.h , glibc __STRICT_ANSI__被替换为__USE_MISC 。 我完全迷失了。 –std=c11和math.h定义的常量之间的故事是什么? 我应该在debian发行版中考虑哪个libc ? 顺便说一句, M_PI在c99和gnu11定义……
有各种开源组装商,如gas , nasm和yasm 。 它们具有不同的pseudo-ops和macro语法。 对于许多开源项目,汇编程序经过预处理以替换常量和平台条件。 假设您可以使用所有当前attributes和#pragmas ,排除翻译性能(编译/汇编到二进制时间), gcc会创建汇编程序有什么限制? 我不是在谈论内联汇编 。 #define MOV(RA,RB) (OXFEB10000UL | RA << 16 | RB) #define ADD(RA,RB) (OXFEB20000UL | RA << 16 | RB) #define RET (OXFEB7ABCDUL) unsigned long add4[] __attribute(section(".text")) = { ADD(R0,R1), ADD(R2,R3), MOV(R1,R2), ADD(R0,R1), RET() }; 我相信使用指针算法可以进行模拟. 和其他labels 。 也许这是一个XY问题 ; 我试图理解为什么有这么多assembly工。 似乎所有事情都可以由预处理器完成,而汇编程序实际上是程序员的首选; 或者我缺少技术限制。 我想这可能与’你可以使用汇编程序做的事情有关,你无法用shell代码做’。 编辑:我已将其从C重新标记为编译器 。 […]
使用内联汇编程序[gcc,intel,c],如何在操作后检查进位标志是否设置?
可能重复: 请帮我理解C中的错误a +++++ b 这是示例代码,为什么“a +++++ b”无法编译,但其他人可以? #include #include int main(int argc, char **argv) { int a = 0; int b = 0; int c = 0; c = a+++b; printf(“a+++b is: %d\n”, c); c = a = b = 0; c = a++ + ++b; printf(“a++ + ++b is: %d\n”, c); c = b […]