Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过引用而不是通过值传递的类型应该有多大?_C++ - Fatal编程技术网

C++ 通过引用而不是通过值传递的类型应该有多大?

C++ 通过引用而不是通过值传递的类型应该有多大?,c++,C++,考虑到移动语义,是否存在一种截止点来定义何时通过引用而不是通过值传递更昂贵 我经常看到示例按值使用基本类型,而一些示例按引用使用类。但是,如果我有一个小的结构或一个小的类,那么通过值传递它们比通过引用传递更好吗 截止点在哪里?按引用传递基本上就是按指针传递(就效率而言) 通过指针/引用传递是移动一个机器本机长度的数据段(也称为:一个字,或32位机器上的32位,等等) 因此,通过值传递小于或等于本机字的任何大小的数据将与通过指针/引用传递一样有效 如果数据/对象大于此值,则需要多次循环才能将其中的

考虑到移动语义,是否存在一种截止点来定义何时通过引用而不是通过值传递更昂贵

我经常看到示例按值使用基本类型,而一些示例按引用使用类。但是,如果我有一个小的
结构
或一个小的
,那么通过值传递它们比通过引用传递更好吗


截止点在哪里?

按引用传递基本上就是按指针传递(就效率而言)

通过指针/引用传递是移动一个机器本机长度的数据段(也称为:一个字,或32位机器上的32位,等等)

因此,通过值传递小于或等于本机字的任何大小的数据将与通过指针/引用传递一样有效

如果数据/对象大于此值,则需要多次循环才能将其中的每个字复制到堆栈中


当数据大小小于一个字时,按值传递不会获得效率。机器将执行一个副本,该副本所用的时间与执行一个完整单词所用的时间一样长。

经验法则:按值传递基本内置类型,按引用传递用户定义类型。请注意,每个规则至少有一个例外。大致指针大小*2总是在我中窃听到,在现代C++中,这个微优化仍然需要手工完成(而且,需要更好地理解移动语义,知道何时通过值传递更大的类型)。考虑到复制的难度<代码>标准::向量“没有那么大。vector中的内容可能非常糟糕,这让我们回到了@101010的经验法则。通过引用传递它。因为如果您稍后向它添加内容,您就不必将它的每个实例都更改为通过引用传递。有没有办法将编译器可以添加到数据成员以进行对齐的填充因素考虑在内?除了在某个时候使用
sizeof
之外?而且,考虑到一个小于一个单词的值所花费的时间和一个引用所花费的时间一样长,为什么有人会按值传递内置类型呢?按引用传递并不总是存在的。直C和非常旧的C++版本只有通过值或指针。从本质上讲,通过引用传递是通过指针传递的一种更安全的方式。所以您可能会问,如果您可以一直按指针传递,为什么要使用按值传递?所有通常的答案都适用于这里。将值传递给引用的另一个原因是,在某些低端硬件平台上可能存在速度优化。通过引用传递仍然需要地址查找来获取数据。“按值传递”将数据放在堆栈上。@NeomerArcana回答关于填充的另一个问题:当传递对象时,可以打包结构/类以最有效地利用空间(请参阅编译器的pragma pack)。这通常会影响数据成员的对齐。因此,如果您有一个带有unit32、uint16和uint64的类,通常32后面会有4个字节的pad,16后面会有6个字节的pad,最后会有64个字节(假设是64位体系结构),如果您打包该类,则没有填充。确定对象有多大的唯一方法是使用sizeof。