相关疑难解决方法(0)

为什么libc ++的std :: string实现占用了3x内存作为libstdc ++?

考虑以下测试程序:

#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++ string libstdc++ libc++

16
推荐指数
4
解决办法
9124
查看次数

如何有效地将左值或右值绑定到同一个引用?

假设您有一个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)

c++ reference ternary-operator rvalue lvalue

6
推荐指数
1
解决办法
104
查看次数

标签 统计

c++ ×2

libc++ ×1

libstdc++ ×1

lvalue ×1

reference ×1

rvalue ×1

string ×1

ternary-operator ×1