c++ - 在函数调用期间是否实际传递了未命名的参数?

标签 c++ micro-optimization

template <typename TAG>
fn(int left, TAG, int right)
{
}

fn(0, some_type_tag(), 1);
/* or */
fn(0,int(), 1); // where the primitive, int, is not empty.

编辑:这个问题有两种观点。

  1. 函数声明与定义。声明可能不会命名参数,但声明可能会命名。这不是我们感兴趣的观点。
  2. 模板视角,特别是元编程。有问题的参数是用于从特征中提取元结构的标签。这就是为什么参数没有命名的原因,我只关心编译时的信息——标签的类型。

/编辑

我的标签通常是空结构,但是在我的代码的某些部分,它们是原始类型的 typedef。所以,我很想知道现代编译器是否真的会传递参数。这有两个方面。

  1. 调整堆栈大小,考虑未命名参数类型的大小。
  2. 实际上是用传入的值构造堆栈。

让我们继续使用 gcc 4.5 和 msvc 2008+

最佳答案

C++ 有单独的翻译。由于参数可以在声明中命名,但不能在函数定义中命名,反之亦然,因此编译器通常无法知道省略函数参数是否安全。当它们都在同一个翻译单元中时,所有内容都可以内联,并且参数名称与优化完全无关。

[已添加]

单独的翻译可能对这种特定情况无关紧要,但是添加这种优化的编译器构建器必须注意。如果它破坏了完全有效的代码,他们不会进行这样的优化。

对于模板,模板函数的类型必须与非模板函数的类型相同,否则无法获取其地址并将其分配给函数指针。同样,您必须考虑单独的翻译。就因为你没有取foo<int>的地址在这个 TU 中并不意味着你不会在另一个 TU 中。

关于c++ - 在函数调用期间是否实际传递了未命名的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071669/

相关文章:

c++ - Visual Studio 不保存启动项目和解决方案配置

math - 使用位移位除以 10?

performance - 为什么循环总是编译成 “do…while”样式(尾跳)?

algorithm - 整数二分查找的极致优化

c++ - 在C++中最快实现简单,虚拟,观察者排序的模式?

c++ - Unordered.map 插入问题与对键

c++ - ExprTk,获取表达式中的符号/变量列表

c++ - 简单记录器类 vsnprintf 因读取访问冲突而崩溃

c++ - 带字符的全局变量

assembly - 为什么使用push/pop而不是sub和mov?