34得票2回答
x86-64架构中的红色区域确切位置在哪里?

来自维基百科: 在计算机中,红区是函数栈帧中一个固定大小的区域,超出返回地址范围,该函数不予保留。调用者函数可以利用红区存储本地变量,而无需修改堆栈指针。这段内存区域不得由中断/异常/信号处理程序修改。System V使用的x86-64 ABI规定了128字节的红区,它直接开始于返回地...

34得票10回答
为什么Mac ABI要求x86-32的16字节栈对齐?

我理解对于旧的PPC RISC系统和x86-64,这个要求是可以理解的,但对于老牌的x86系统呢?在这种情况下,堆栈只需要按4字节边界对齐即可。是的,一些MMX/SSE指令需要16字节对齐,但如果调用方有此要求,则应确保对齐正确。为什么要给每个调用者加上这个额外的要求呢?这实际上可能会导致一些...

33得票1回答
数组初始化优化

在编译以下代码片段时(clang x86-64 -O3) std::array<int, 5> test() { std::array<int, 5> values {{0, 1, 2, 3, 4}}; return values; } 它生成了我...

31得票3回答
gcc中如何实现可变参数?

int max(int n, ...) 我使用了cdecl调用约定,其中调用者在被调用函数返回后清理变量。 我想知道宏va_end、va_start和va_arg是如何工作的? 调用者是否将参数数组的地址作为max函数的第二个参数传入?

31得票2回答
为什么在C++中,std::tuple会破坏小尺寸结构体的调用约定优化?

C++有一个小型结构体调用约定优化,编译器以与传递原始类型(例如,通过寄存器)相同的效率传递函数参数中的小型结构体。例如: class MyInt { int n; public: MyInt(int x) : n(x){} }; void foo(int); void foo(MyInt)...

29得票3回答
Scala可以按引用调用吗?

我知道Scala支持从ALGOL继承的按名调用(call-by-name),我也认为我理解它的含义,但是Scala能否像C#、VB.NET 和 C++一样支持按引用调用(call-by-reference)呢?我知道Java不能按引用传递,但我不确定这种限制是否仅仅是语言本身的问题,还是JVM...

28得票5回答
C编译器如何实现返回大型结构体的函数?

一个函数的返回值通常会被存储在堆栈或寄存器中,但如果是一个大的结构体,则必须存储在堆栈上。对于这段代码,在真正的编译器中需要进行多少复制操作?或者说它会被优化掉吗? 例如:struct Data { unsigned values[256]; }; Data createData(...

27得票3回答
函数指针和调用约定

float __stdcall (*pFunc)(float a, float b) = (float (__stdcall *)(float,float))0x411280; 如何声明一个带有调用约定的函数指针?上述代码给我报错。

27得票4回答
如何在C语言中跳转到不同的函数?

我基本上正在尝试用C语言模拟汇编代码。 这是C代码:int main() { test(); main_next: printf("Hello, World!"); } void test() { goto main_next; } 在尝试编译此代码(Linux 32...

26得票1回答
如果我没有包含头文件,为什么在调用函数之前会清除EAX?

以下是需要翻译的内容: 在下面的C代码中: #include <stdio.h> int main(void){getchar();} 它生成以下汇编代码: main: push rbp mov rbp, rsp ...