小编Xia*_*Guo的帖子

在 Linux/x86-84 上传递大对象的 C++ 调用约定

我试图了解在 C++/Linux/x86-64 平台中按值传递对象作为函数参数的开销。

我用于探索的实验代码发布在下面和 Godbolt.org 上:https ://godbolt.org/z/r9Yfv4

假设函数是一元的。我观察到的是:

  1. 如果参数对象的大小为 8 字节,则将其放入 RDI。
  2. 如果参数大小为 16 字节(每 8 字节包含两个子对象),则将这两个子对象放入 RDI 和 RSI。
  3. 如果参数大于 16 字节,它将通过堆栈传递。

我只考虑整型和指针以及这些基本类型的组合类型。我知道传递浮动/双打是不同的。

的大小std::function为 32 字节(GCC/Linux 实现,long + long + 指针 + 指针 = 32 字节。)。所以std::function按值传递应该看起来像struct Person4在我的代码中定义的传递。但是输出程序集显示 passstd::function与 pass 非常不同struct Person3。看起来 std::function 是通过指针传递的,对吗?为什么会有这样的差异?

#include <functional>

struct Person0 {
  long name;
};

long GetName(Person0 p) {
  return p.name;
}

struct Person1 {
  long name;
  long age;
};

long GetName(Person1 …
Run Code Online (Sandbox Code Playgroud)

c++ linux assembly x86-64 calling-convention

5
推荐指数
1
解决办法
113
查看次数

标签 统计

assembly ×1

c++ ×1

calling-convention ×1

linux ×1

x86-64 ×1