Tag: gcc

迫使GCC放弃归零某些全局变量

有没有办法告诉GCC不将特定的全局数组初始化为零? 我想保留一大块内存来存储我的代码管理的大型数据结构,所以我说: #define SIZE_16_MB 0x01000000 BYTE mChunkSpace[SIZE_16_MB]; 问题是crtinit()需要一百万年才能将这个空间初始化为零,而且根本不需要它。 有什么方法可以强迫它不要初始化那个空间吗? 目前我正在硬编码一个超出链接器知道的内存地址,但这并不是一种特别强大的做事方式。 此外,这是一个缓慢的嵌入式proc(50MHz Microblaze),所以不要以为我在谈论PC。 确实需要很长时间才能将该空间归零。

自定义支持__attribute __((格式))

GCC和Clang都支持对变量参数函数(如printf进行编译时检查。 这些编译器接受如下语法: extern void dprintf(int dlevel, const char *format, …) __attribute__((format(printf, 2, 3))); /* 2=format 3=params */ 在OSX上,Cocoa框架也对NSString使用了这个扩展: #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A))) 在我们公司,我们有一个自定义C ++框架,其中包含一些类,如BaseString所有类都派生自BaseObject 。 在BaseString有一些类似于sprintf变量参数方法,但有一些扩展。 例如, “%S”需要类型为BaseString*的参数,而”%@”需要BaseObject*参数。 我想对我们项目中的参数执行编译时检查,但由于扩展, __attribute__((format(printf)))给出很多误报警告。 有没有办法为两个编译器之一定制__attribute__((format))的支持? 如果这需要编译器源的补丁,它是否可以在合理的时间内完成? 或者,是否有其他类似工具的lint可以执行检查?

强制/说服/欺骗GCC展开_Longer_循环?

我如何说服GCC展开一个已知迭代次数但又很大的循环? 我正在使用-O3编译。 当然,有问题的真实代码更复杂,但这是一个具有相同行为的简化示例: int const constants[] = { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144 }; int get_sum_1() { int total = 0; for (int i = 0; i < CONSTANT_COUNT; ++i) { total += constants[i]; } return total; } …如果CONSTANT_COUNT被定义为8(或更少),那么GCC将展开循环,传播常量,并将整个函数减少为简单的return ; 。 另一方面,如果CONSTANT_COUNT为9(或更大),则循环不会展开,GCC会生成一个二进制循环,读取常量,并在运行时添加它们 – 即使理论上该函数可以仍然被优化到只返回一个常数。 (是的,我看过反编译的二进制文件。) 如果我手动展开循环,如下所示: int get_sum_2() […]

为什么结构中只有“char”类型的成员没有填充?

我在结构中只声明了char类型的成员。 #include struct st { char c1; char c2; char c3; char c4; char c5; }; int main() { struct st s; printf(“%zu\n”, sizeof(s)); return 0; } 输出: [ 现场演示 ] 5 那么,为什么结构中只有char类型成员没有填充?

执行从x86程序集编译的程序时出现分段错误?

我是汇编语言的新手,我必须实现一个函数,在我的例子中是sin(x),可以从C源文件调用。 我必须制作两个单独的文件:* .c和* .s在ubuntu上通过gcc编译时都很好,但是当程序执行时它会给出错误“Segmentation fault”… 编译我输入: gcc -c -o sinc.o sinx.c -g3 gcc -c -o sins.o sinx.s -g3 gcc -o sinx sinc.o sins.o -g3 当我启动程序时: ./sinx 它打印: …….insert x: 我把x放进去然后: segmentation fault 它停止了 这是两个文件: /*———————————–Sin[x]—————————————-*/ extern float Sin(float x); //extern assembly function #include //necessary libraries int main() // main function { float x; //allocate variable […]

实际上在C中未定义的行为可能会发生什么

我读了很多关于未定义行为(UB)的文章,但所有人都谈论理论。 我想知道在实践中会发生什么,因为包含UB的程序实际上可能会运行。 我的问题涉及类似unix的系统,而不是嵌入式系统。 我知道不应该编写依赖于未定义行为的代码。 请不要发送这样的答案: 一切都会发生 守护进程可以飞出你的鼻子 电脑可以跳起来并着火 特别是对于第一个,它不是真的。 通过执行有符号整数溢出显然无法获得root权限。 我这只是为了教育目的而要求这个。 问题A) 资源 实现定义的行为:未指定的行为,其中每个实现记录了如何进行选择 编译implementation了吗? 问题B) *”abc” = ‘\0’; 除了发生段错之外的其他事情,我是否需要破坏我的系统? 即使不可预测,究竟会发生什么? 第一个字节可以设置为零吗? 还有什么,怎么样? 问题C) int i = 0; foo(i++, i++, i++); 这是UB,因为未定义参数的计算顺序。 对。 但是,当程序运行时,谁决定参数的评估顺序:是编译器,操作系统还是别的什么? 问题D) 资源 $ cat test.c int main (void) { printf (“%d\n”, (INT_MAX+1) < 0); return 0; } $ cc test.c -o […]

为什么GCC没有优化对printf的这个调用?

#include int main(void) { int i; scanf(“%d”, &i); if(i != 30) { return(0); } printf(“i is equal to %d\n”, i); } 结果字符串似乎总是“我等于30”,那么,为什么GCC不会通过调用puts()或write()来优化对printf的调用? (刚刚使用gcc -O3 (版本5.3.1)或Godbolt Compiler Explorer检查生成的程序集)

Ansi-C中的单行注释

我习惯//来标记来自Java和Visual Studio的单行注释,并且对于Ansi-C不存在这一点感到惊讶。 使用/* my comment */非常烦人。 使用Ansi-C时是否还有其他方法可以标记单行注释?

实施关键部分

创建关键部分的方式更好,更快? 使用二进制信号量,在sem_wait和sem_post之间。 或者使用primefaces操作: #include void critical_code(){ static volatile bool lock = false; //Enter critical section while ( !__sync_bool_compare_and_swap (&lock, false, true ) ){ sched_yield(); } //… //Leave critical section lock = false; }

Python C绑定错误

我用C代码编写了一个Python API,并将文件保存为foo.c. 码: #include #include static PyObject *foo_add(PyObject *self, PyObject *args) { int a; int b; if (!PyArg_ParseTuple(args, “ii”, &a, &b)) { return NULL; } return Py_BuildValue(“i”, a + b); } static PyMethodDef foo_methods[] = { { “add”, (PyCFunction)foo_add, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initfoo() { Py_InitModule3(“foo”, foo_methods, “My […]