为什么Qt代码中的QChar是通过值而不是const引用传递的?

时间:2017-01-01 13:24:53

标签: c++ qt

在QString构造函数和其他函数中,QChar按值传递,而不是由const ref:QString(QChar ch)传递,但它本身是一个类(class QChar),而不是POD类型。为什么会这样过去?

2 个答案:

答案 0 :(得分:3)

Qt 5.6.2中的QChar类有一个数据成员unsigned short。因此,sizeof(QChar)在大多数平台上都是2。这比你通常的指针(通常是4或8字节)小。

因此,您可以像对待任何其他基本类型一样对待QChar。事实上它的设计是以这种方式工作的,因为它取代了Qt API中的char

传递const ref的原因是效率,对大型物体非常有意义。在这些情况下,通过价值传递将意味着昂贵的副本。所以你交换它是为了增加间接(因为在引擎盖下引用通常用指针实现)并且更好。对于推理不成立的基本类型。复制很便宜,因此传递值并避免增加间接效率会更有效。

答案 1 :(得分:0)

根据一些人的说法,这是因为QChar只有2个字节,而指针是4个或8个字节,所以效率更高。

但是,这不是完整的故事。现代机器需要同时传递一个体系结构本地指针,因为它们传递单个字节,最后它们都以32位或64位寄存器结束。虽然事实并非如此,但是机器在传递大整数时速度要慢得多,但它们的指针长度也不是4或8个字节。所以充其量,如果你说像30年前那样在16位机器上传递一个字节而不是参考,那么会有一些好处。

请记住,如果实际传递了引用,它只是一个指针,因此效率低下与使用额外的间接层有关。为什么传递一个指针只是为了在内存中的其他地方寻找该对象,当你可以传递对象本身时。至少在理论上。

在实践中,编译器非常擅长优化。可以在热点中调用并且可能导致有形开销的任何类型的函数都是微不足道的,因此编译器会内联而不是调用,因此不会传递参数。如果你比较两个简单的函数,一个通过值传递而另一个通过引用传递,你会发现它们会产生完全相同的机器代码。

所以,它是通过价值传递的,因为这在理论上是有意义的,即使它在实践中并不重要。而且因为你节省了一点打字。如果要修改函数外部的对象,则只需要通过引用传递。

相关问题