Tag: 编译器构造

通过分析程序集列表validationgcc / g ++中的编译器优化

我刚刚问了一个与编译器如何优化某些C ++代码有关的问题,我正在寻找有关如何validation编译器是否已执行某些优化的任何问题。 我试图查看用g ++( g++ -c -g -O2 -Wa,-ahl=file.s file.c )生成的汇编列表g++ -c -g -O2 -Wa,-ahl=file.s file.c什么,但输出太神秘了对我来说。 人们使用什么技术来解决这个问题,是否有任何关于如何解释优化代码的汇编列表或特定于GCC工具链的汇编列表来讨论这个问题的任何好的参考?

如何找到我当前的编译器标准,如果它是C90等

我正在研究Linux机器。 是否有任何系统命令可以找到我正在使用的C编译器后面的标准?

C编程:从汇编程序的角度来看++ i和i = i + 1之间的区别?

这是一个面试问题。 我说他们是一样的,但这被判定为不正确的回应。 从汇编程序的角度来看,有什么可以想象的区别吗? 我使用默认的gcc优化和-S编译了两个简短的C程序来查看汇编器输出,它们是相同的。

矢量化是什么意思?

向量化代码是一个好主意吗? 在什么时候这样做有什么好的做法? 下面会发生什么?

结构混乱

我想创建一个函数,它获取一本书的标题和作者,如果它可用或不可用则返回0或1,通过将它们与给定的结构数组进行比较…..编译器显示: structs.c:10:28: error: expected ‘)’ before ‘title’ structs.c: In function ‘main’: structs.c:59:21: error: expected expression before ‘bookRecord’ structs.c:60:13: error: expected expression before ‘bookRecord’ structs.c:61:9: warning: implicit declaration of function ‘requestBook’ structs.c:61:23: error: expected expression before ‘bookRecord’ 这是代码: #include #include #include #define TRUE 1 #define FALSE 0 #define NUM_BOOKS 5 int requestBook(bookRecord title[],bookRecord author[]){ /* compiler […]

将c代码转换为x86程序集的简便方法?

是否有一种简单的方法(如免费程序)可以将c / c ++代码转换为x86程序集? 我知道任何c编译器都做了非常类似的事情,我可以编译c代码,然后反汇编编译的可执行文件,但这有点过分,我想要的只是转换几行代码。 有谁知道一些程序可以做到这一点? 编辑:我知道GCC编译器这样做,但它是AT&T语法,我正在寻找英特尔语法(不确定它是否称为英特尔语法)。 AT&T语法看起来有点像胡言乱语,有些命令以相反的顺序使用操作数,而不是我习惯的方式,它可能会让人感到困惑。

在进入C ++之前我应该​​先学习什么?

我正在学习C,但在那之后或同时,在进入C ++之前我应该​​先学习什么? 编译器,数据结构,UML或设计模式?(也是在开始学习Win32 API的时候?)我根本不急,所以我可以从最深的开始掌握这些要求。 我只是不想因为粗略和疏忽而迷失方向。 除此之外,哪些数学科目对编码影响最大? 线性代数,离散数学,微积分? 如果有人引导我完成这段旅程,我将感激不尽。 我想知道答案有很多问题。 谢谢。

C not运算符是否适用于int?

我有 int x = 5; printf(“%d”, x); //i get 5… expected x = !x; printf(“%d”, x);// i get 0… hmm 二进制中的5是:0101如果我们对每个位应用逆,我们应该得到1010,但是! 它不一定是逆变器,它是一个逻辑运算符。 为什么我得到0 ? 是这样的原因,在C中,正数被视为真,所以! – 它会导致0? 这个编译器具体吗?

为什么gcc在返回指向局部变量的指针时抛出警告而不是在返回局部变量时抛出警告?

请参阅下面的代码示例。 函数fun_ret_loc_ptr()的语句return (&i)返回一个警告:“函数返回局部变量的地址”。 另一方面,语句return a函数fun_ret_loc_var()不会这样做。 #include int* fun_ret_loc_ptr() { int i = 10; return (&i); } int fun_ret_loc_var() { int a = 20; return a; } int main() { printf(“val frm local ptr = %d\n”, *fun_ret_loc_ptr()); printf(“val frm local var = %d\n”, fun_ret_loc_var()); } 我理解在第一个函数中返回的地址( return (&i); )被fun_ret_loc_ptr()到一个内存位置,该内存位置是与函数fun_ret_loc_ptr()对应的堆栈帧的一部分。 一旦此函数返回,堆栈帧(激活记录)将被销毁。 同样的事情应该适用于函数fun_ret_loc_var()的变量’a’( return a; fun_ret_loc_var() 。 即使它被返回,当它在main中使用时,对应于’a’的内存也会死亡。 […]

作业和序列点:这是多么模糊?

考虑C代码a = a = a 。 没有用于赋值的序列点,因此在编译关于a的未定义操作时,此代码会产生警告。 这里有什么可能的价值? 似乎无法改变价值观。 这里有没有未定义的行为或编译器只是懒惰?