Tag: gcc

编译器优化导致程序运行速度变慢

我在C中编写了以下代码。它非常简单,因为它恰好为每个for循环移位x 。 int main() { int x = 1; for (int i = 0; i > -2; i++) { x >> 2; } } 现在发生的奇怪的事情是,当我只是编译它而没有任何优化或第一级优化( -O )时,它运行得很好(我正在计时可执行文件和它的大约1.4s -O和5.4s没有任何优化。 现在当我添加-O2或-O3开关进行编译并为生成的可执行文件计时时,它不会停止(我已经测试了多达60s )。 关于可能导致这种情况的任何想法?

在C(gcc)中获取指向当前函数的指针?

gcc中有一个魔术变量,它持有一个指向当前函数的指针吗? 我想有一种表包含每个函数指针的一组信息。 我知道有一个__func__变量包含当前函数的名称作为字符串但不作为函数指针。 这不是为了调用函数而是仅仅用作索引。 编辑基本上我想做的是能够在执行当前函数之前运行嵌套函数(并且还捕获返回以执行某些操作。)基本上,这就像__cyg_profile_func_enter和__cyg_profile_func_exit(检测函数)。但问题是这些仪器function是全局的而不是function专用的。 编辑在linux内核中,您可以使用include/linux/kallsyms.h unsigned long kallsyms_lookup_name(const char *name) …请注意,必须激活CONFIG_KALLSYMS选项。

内联x86程序集中是否未定义整数溢出?

说我有以下C代码: int32_t foo(int32_t x) { return x + 1; } 当x == INT_MAX时,这是未定义的行为。 现在说我用内联汇编代替了: int32_t foo(int32_t x) { asm(“incl %0” : “+g”(x)); return x; } 问题:当x == INT_MAX时,内联汇编版本是否仍会调用未定义的行为? 或者未定义的行为仅适用于C代码?

C中的<:语法有什么意义?

可能重复: <:无法开始模板参数列表 你知道吗 int a; 相当于 int a[10]; ? 我正在编写一些代码,其中我有一个全局命名空间和一个受限制的命名空间,现在就说NS1。 我在我的全局命名空间中有一个名为Module的类,我在NS1中导入了一些其他库,它们也有一个名为Module的类。 我试图创建一个我的模块的std :: list,即在NS1中的一个函数内部的:: Module,这样做,我得到了这个编译错误 std::list &myModule; genllvm.cpp:60:11: error: ‘<::' cannot begin a template-argument list ./genllvm.cpp:60:11: note: '<:' is an alternate spelling for '['. Insert whitespace between '<' and '::' ./genllvm.cpp:60:11: note: (if you use '-fpermissive' G++ 这个“<:”语法有什么意义?

为什么普通变量不允许使用位域?

我想知道为什么位域与联合/结构一起使用但不能使用像int或short这样的正常变量。 这有效: struct foo { int bar : 10; }; 但这失败了: int bar : 10; // “Expected ‘;’ at end of declaration” 为什么此function仅在联合/结构中可用而不在变量中? 技术不一样吗? 编辑: 如果允许,你可以创建一个3字节的变量,而不是每次都使用struct / union成员。 这就是我对结构的看法: struct int24_t { int x : 24 __attribute__((packed)); }; struct int24_t var; // sizeof(var) is now 3 // access the value would be easier: var.x = […]

编译器之间的浮点不匹配(Visual Studio 2010和GCC)

我正在努力解决一个正在出现的跨平台问题,我不确定如何解决这个问题。 这是一个演示程序: #include #include int main() { int xm = 0x3f18492a; float x = *(float*)&xm; x = (sqrt(x) + 1) / 2.0f; printf(“%f %x\n”, x, *(int*)&x); } 在VS2010中编译时,Windows上的输出是: 0.885638 3f62b92a 使用GCC 4.8.1 (ideone.com示例)编译时的输出是: 0.885638 3f62b92b 在需要在多个平台上以相同方式运行的程序过程中,这些小的不匹配最终会成为一个严重的问题。 我并不太关心“准确性”,因为结果相互匹配 。 我尝试将VS中的/fp模式从precise切换到strict ,但这似乎并没有解决它。 我应该考虑采用哪些其他途径来进行此计算,在两个平台上都有相同的结果? 更新 :有趣的是,如果我更改这样的代码,它会跨平台匹配: #include #include int main() { int xm = 0x3f18492a; float x = […]

用于字符串初始化的gcc诊断不一致

我正在使用gcc 4.9.1 / Mingw并使用以下代码编译代码: gcc test.c -otest.exe -std = c11 -pedantic-errors -Wall -Wextra 此代码提供诊断: int main (void) { char a[5] = {‘h’,’e’,’l’,’l’,’o’,’\0′}; } 错误:数组初始化程序中的多余元素char [5] 但是,此代码不会产生警告: int main (void) { char b[5] = “hello”; } 我认为这两种forms是100%相同的。 C标准中有什么理由或微妙之处,为什么后者不应该发出警告? 或者这是编译器错误? 我知道C标准允许多余的初始化器,与C ++不同,所以我不相信gcc 需要进行诊断。 但我希望编译器能够始终如一地发出警告。

C Struct数组成员没有特定长度

我遇到过这段代码: struct test { uint32 num_fields; char array_field []; }; 我怎么能理解array_field ? 这是C语言的gcc扩展吗?

如何使用带有Linux子系统的GCC编译Windows的可执行文件?

Windows 10周年更新包括适用于Ubuntu的Linux子系统。 我用sudo apt-get install gcc 。 我为测试目的写了一些简单的C代码: #include int main(void){ printf(“Hello\n”); return 0; } 并使用gcc -c main.c编译它,但生成了execute(仅限Linux) main.o 。 如果我运行它./main.o ,它会显示Hello 。 我的问题是,如何编译main.c以便Windows可以运行它? 基本上,如何在Linux子系统中使用GCC生成*.exe文件?

从C执行二进制机器代码

按照这个说明,我设法只产生528字节的大小a.out(当gcc main.c最初给我8539字节的大文件时)。 main.c是: int main(int argc, char** argv) { return 42; } 但我已经从这个汇编文件中构建了一个a.out: 电源: ; tiny.asm BITS 64 GLOBAL _start SECTION .text _start: mov eax, 1 mov ebx, 42 int 0x80 有: me@comp# nasm -f elf64 tiny.s me@comp# gcc -Wall -s -nostartfiles -nostdlib tiny.o me@comp# ./a.out ; echo $? 42 me@comp# wc -c a.out 528 […]