Tag: 编译器构造

C ++ by-reference参数和C链接

我遇到了一段代码(使用XLC8和MSFT9编译器),包含一个带有C链接和引用参数定义的函数的C ++文件。 这让我很烦,因为引用只是C ++。 有问题的函数是从C代码调用的,其中它被声明为将指针参数取代为相同类型而不是引用参数。 简化示例 : C ++文件 : extern “C” void f(int &i) { i++; } C档案 : void f(int *); int main() { int a = 2; f(&a); printf(“%d\n”, a); /* Prints 3 */ } 现在,街上的一句话就是大多数C ++编译器,它们都像指针一样实现引用。 是这样的,只是纯粹的运气,这个代码工作的原因,或者它在C ++规范中的某处说,当你用引用参数和C链接定义一个函数时结果是什么? 我无法找到任何相关信息。

gcc复合常数折叠

似乎gcc对复杂的常量折叠有一些限制。 这是一个例子: static inline unsigned int DJBHash(const char *str) { int i; unsigned int hash = 5381; for(i = 0; i < strlen(str); i++) { hash = ((hash << 5) + hash) + str[i]; } return hash; } int f(void) { return DJBHash("01234567890123456"); } 当使用-O3优化级别(gcc 4.8)运行时,它很好地展开了DJBHash中的循环,并在编译期间计算该字符串的哈希值。 但是,当字符串长一个字符时, return DJBHash(“012345678901234567”); 它不再折叠它并使用条件跳转指令生成循环。 我想将任意长度的文字字符串折叠为其哈希值作为编译时常量。 这可以吗? 澄清 我的问题是关于gcc的常量折叠优化(参见标题 – […]

全局变量实现

当我写下面的程序时: 档案1: #include int global; void print_global1() { printf(“%p\n”, &global); } 文件2: #include char global; void print_global2() { printf(“%p\n”, &global); } 档案3: void print_global1(); void print_global2(); int main() { print_global1(); print_global2(); return 0; } 输出: $ ./a.out 0x804a01c 0x804a01c 这是我的问题: 为什么链接器将“int global”和“char global”实现为相同的全局变量: 为什么编译器不会抱怨(不是最小的警告-Wall -Wextra -ansi …) 如何管理全局变量的大小(int和char的大小不同) PS:第二个问题是架构/编译器相关,所以让我们把gcc或Visual C ++(对于C)的int大小为32位 编辑:这不是C ++的问题,但对于C! 我使用gcc版本4.4.1和Ubuntu 9.10,这是编译控制台输出: […]

编译错误C2099:初始化程序不是常量

以下代码不会编译: const int a = 0; struct Test { int b; }; static const struct Test test = { a }; 它是我真正想要做的一个减少的例子,但我做错了什么?

如何使用GCC编译器强制执行struct bit顺序?

我想知道是否有一个GCC C编译器指令允许我确定结构打包的位顺序? 喜欢的东西: #pragma bit_order left 这种需求的基本原理是我有以下结构: struct { union { unsigned char BYTE; struct { unsigned char B0: 1; unsigned char B1: 1; unsigned char B2: 1; unsigned char B3: 1; unsigned char B4: 4; }BIT; }ITEM; } myStruct; 有了这个结构,我希望编译器以这种方式打包: Bit order: | 7 6 5 4 3 2 1 0 | Label: |B0 […]

我可以依靠我的编译器来优化const char *上的strlen吗?

在我的SAX xml解析回调(XCode 4,LLVM)中,我正在对这种类型的代码进行大量调用: static const char* kFoo = “Bar”; void SaxCallBack(char* sax_string,…..) { if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0) { } } 假设strlen(kFoo)由编译器优化是否安全? (Apple示例代码已经预先计算了strlen(kFoo),但我认为这对于大量常量字符串很容易出错。) 编辑:优化的动机:使用NSXMLParser在iPod touch 2G上解析我的SVG地图需要5秒钟(!)。 所以,我想切换到lib2xml,并优化字符串比较。

C89 vs c99 GCC编译器

如果我使用c89和c99编译以下程序有区别吗? 我得到相同的输出。 两者之间真的有区别吗? #include int main () { // Print string to screen. printf (“Hello World\n”); } gcc -o helloworld -std=c99 helloworld.c vs gcc -o helloworld -std=c89 helloworld.c

变量名如何存储在C中?

我想问一下C变量是如何存储在C中的? 为了更清楚,请考虑以下代码: int main() { int a = 1, b; b = a + 2; return 0; } 例如,这里存储器C存储可变位置的名称。 例如,如果&a=0x12A7 (假设) &b=0x123B1 ,那么c如何以及在何处存储变量名称,例如存储内存名称a ?

汇编,机器代码,字节码和操作码之间的实际关系是什么?

汇编,机器代码,字节码和操作码之间的实际关系是什么? 我已经阅读了大部分有关汇编和机器代码的SO问题,例如,但它们的级别太高,并没有显示实际汇编代码转换为机器代码的示例。 结果,我仍然不明白它是如何在更深层次上运作的。 这个问题的理想答案将显示一些汇编代码的具体示例,例如下面的代码段,以及每个汇编指令如何映射到机器代码,字节码和/或操作码。 这样的答案对未来的人们学习集会非常有帮助,因为在过去几天的挖掘过程中,我还没有找到任何明确的总结。 我要找的主要内容是: 一段汇编代码 一段机器代码 程序集和机器代码片段之间的映射 (如何进行映射,或者至少是一些一般示例,以及如何知道如何执行此操作,Web上的所有这些信息都在哪里) 如何解释机器代码 (就像操作码以某种方式相关,以及网上关于所有这些数字意味着什么的所有信息) 注意:我没有计算机科学背景,所以我在过去几年里一直在慢慢走低水平,现在已经到了想要了解assembly和机器代码的程度。 assembly与机器代码之间的关系 我目前的理解是“汇编程序”(如NASM)接收汇编代码并从中创建机器代码。 所以当你编译一些像这个example.asm这样的程序集时: global main section .text main: call write write: mov rax, 0x2000004 mov rdi, 1 mov rsi, message mov rdx, length syscall section .data message: db ‘Hello, world!’, 0xa length: equ $ – message (用nasm -f macho64 -o example.o example.asm编译它)。 […]

为什么c / c ++允许在函数调用中省略多维数组的最左边索引?

我只是想知道为什么在将数组传递给函数时允许省略多维数组的最左边索引? 为什么不是一个以上的索引? 编译器如何在省略一个索引的情况下找出大小?