出于好奇,我想知道gcc是否可以通过某种方式不优化任何函数调用?
在生成的汇编代码中,printf函数由putchar代替。即使使用默认的-O0最小优化标志,也会发生这种情况。
#include <stdio.h>
int main(void) {
printf("a");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(Godbolt显示GCC9正在执行此操作,clang8使其保持不变。)
最近我有一个问题,我知道一个指向常量数组的指针(在下面的代码中初始化)位于该.rodata区域中,并且该区域仅可读。但是,我在模式C11中看到,此内存地址行为的写入将是不确定的。我知道Borland的Turbo-C编译器可以在指针指向的地方写,这是因为处理器在当时的某些系统上以实模式运行,例如MS-DOS?还是与处理器的操作模式无关?使用保护模式下的处理器,是否还有其他编译器可以写入指针并且不会导致任何内存破坏失败?
#include <stdio.h>
int main(void) {
char *st = "aaa";
*st = 'b';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此代码与MS-DOS中的Turbo-C一起编译时,您将能够写入内存
我在这里的PC上有一个Intel处理器,它以64位模式x86_64运行,如果我使用字寄存器或使用某些标志优化功能,则寄存器的大小为64位,该变量往往放在寄存器中,但是,如果我将值放在32位以上,则编译器会抱怨,即我的int不是64位,为什么会发生这种情况?如果将变量放在寄存器中,那不是64位,我什至没有得到它的内存地址?也就是说,它甚至没有放置在堆栈上。
#include <stdio.h>
int main(void) {
register int x = 4294967296;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
gcc example.c -o example -Wall -Wextra
输出:
警告:隐式常量转换[-Woverflow]寄存器int x = 4294967296中溢出;
I'm trying to compile the gcc 3.0.1 files. When I use configure, it gives an error with the following message
Configuration x86_64-unknown-linux-gnu not supported
关于数据类型对齐的怀疑,我现在正在学习对齐,还有一些问题,所以我知道在用gcc编译i386体系结构时,linux中double对齐为4个字节,因此double的地址与a对齐4的倍数,但只有在使用数据结构时,才会在使用堆栈时发生
#include <stdio.h>
int main(void) {
double x = 5; // 8
char s = 'a'; // +1
double y = 2; // ---- = 9 + 8 = 17 + alignment = 20
//int x = 5; // 4
//char s = 'a'; +1
//int y = 2; --------= 5 + 4 = 9 + alignment = 12
size_t a, b;
a = (size_t)&s;
b = (size_t)&y;
printf("%zu", a - b); // it wasn't supposed to be 11 instead …Run Code Online (Sandbox Code Playgroud)