c++ - 这个关于确定将参数传递给函数的方法的技巧给我带来了一些困惑

标签 c++ function parameter-passing

这里有一个提示让我有些困惑:“让最好的传递方法按值传递内置类型,并通过引用常量传递其他类型”现在我有以下一些问题:

1-首先,我认为建议通过对常量的引用传递背后的原因是,如果引用的对象不是 volatile 的,编译器可以将其转换为按值传递,如果这样效率更高,但它会更有意义对我来说,如果有一种特殊的语法,我们可以通过它告诉编译器好吧,在这里自己确定最佳传递方法我不在乎它会怎样,但是将按引用传递更改为常量以由编译器按值传递对我来说似乎有些困惑,如果我们希望编译器遵守对常量的引用传递并使用指针,我们必须强制它这样做,因为它可能确定更有效的方法是按值传递;那么你能解释一下为什么会这样吗?

2-“按值传递内置类型”是否包括大小大于指针大小的内置类型,例如我平台上的 long double 具有 8 个字节,而指针大小为 4 个字节并且确实“通过引用常量传递非内置类型”包括像下面这样的东西,它们可能像内置类型一样在内存中传输:

struct Test1{
 public:
  char characters[2];
};
struct Test2{
 public:
  char characters[4];
};

最佳答案

a special syntax by which we could tell the compiler ok here determine the best passing method yourself

Boost 提供了这个,如 boost::call_traits<T>::param_type .

why it is this way that this is

可能是因为经验法则在大多数时候都有效。如果有疑问,您可以通过 const 引用传递,它不太可能非常低效。

事实上,一般提示比您说的更多 - 非内置的“小”类型通常也最好按值传递。例如,标准库始终按值传递迭代器。

Does "pass built-in types by value" include built-in types that are bigger in size than size of a pointer

是的。您可以合理地期望 C++ 实现通过 doublelong double对于几乎所有实际目的,按值(value)和可接受的效率计算。如果您已经达到了最容易实现的优化阶段,那么您就超出了一般提示的范围。您将在实际程序中对两者进行测量。

if the referenced object is not volatile the compiler can convert it to pass by value if it would be more efficient

也许吧。如果调用成功内联,那么编译器几乎可以做任何事情。如果调用目标对编译器不可用,那么它就无法执行,因为在实践中,值与 const 引用参数之间的更改需要更改调用者和被调用者代码。此外,别名意味着除非编译器有很多关于正在发生的事情的信息,否则即使是非 volatile 对象,它也不一定会假设它不会改变:

int foo(const int &a, int &b) {
    b = 2;
    return a;
}

除非内联,否则无法更改此代码以通过 a按值(value),因为有人可能会这样调用它:

int a = 1;
std::cout << foo(a,a);

必须打印“2”,而使用 a按值传递,它将打印“1”。

关于c++ - 这个关于确定将参数传递给函数的方法的技巧给我带来了一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233460/

相关文章:

javascript - 在 body 标签内声明函数会导致 "Function not defined"

PHP - 从另一个文件调用函数而不包含它

c++ - 如何将一个类的对象传递给同一个类的函数?

c++ - 使用 QStyle 设置全局默认最小 QPushButton 高度

c++ - 这个c++程序没有执行什么?

c++“没有要调用的匹配函数

ios - 将变量传递给 void ^() block

c++ - 如何将解码缓冲区从 ffmpeg 映射到 QVideoFrame?

c++ - C++ 中的 OOD : Having a class with just one method?

javascript - 这是 jquery 中其他函数的参数