考虑以下测试程序:
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::cout << sizeof(std::string("hi")) << " ";
std::string a[10];
std::cout << sizeof(a) << " ";
std::vector<std::string> v(10);
std::cout << sizeof(v) + sizeof(std::string) * v.capacity() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出libstdc++和libc++分别是:
8 80 104
24 240 264
Run Code Online (Sandbox Code Playgroud)
如您所见,libc++对于一个简单的程序,需要3倍的内存.实现有何不同会导致这种内存差异?我需要关注,我该如何解决它?
假设您有一个C++函数,它使用(const)参数的更改版本.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
MyObject const & altered( alter_obj( original ) );
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是正常的,因为临时的寿命延长,因为"最重要的const".如果alter_obj()满足返回值优化的要求,它也是相当有效的,因为RVO意味着不会不必要地复制由值返回的更改对象.
如果你根本没有改变它也会很有效:
void func( MyObject const & original ) {
MyObject const & not_altered( original );
// ...
}
Run Code Online (Sandbox Code Playgroud)
对给定对象的附加引用基本上是免费的,没有制作副本的任何性能开销.
但是说需求会有所改变,并且您希望根据运行时条件选择是否进行更改.天真地,我原本以为使用三元运算符来组合前两种方法将是有效的,在可能的情况下直接绑定原始对象,或者如果不是则绑定临时对象.
MyObject alter_obj( MyObject const & obj ); // Creates new, altered object
void func( MyObject const & original ) {
// ...
MyObject const & …Run Code Online (Sandbox Code Playgroud)