gpt4 book ai didi

c++ - 避免对临时对象、右值析构函数进行不必要的分配

转载 作者:行者123 更新时间:2023-11-30 03:34:58 27 4
gpt4 key购买 nike

我有很多很多字符串,它们在创建后几乎从未被修改过,对它们的访问时间并不是真正的问题。我必须尽量减少内存使用,所以我选择编写一个类而不是使用 std::string,它必须保存额外的数据,例如容量和长度以符合标准。此更改导致内存使用量减少了 ~%30。

为了实现这一点,我编写了一个类,它只在内部包装 C 风格的空终止字符串并管理缓冲区,因此该类只包含一个指针数据成员,它提供了足够的接口(interface),很少像 std::string.

我想避免样板代码并允许从 std::stringstd::string 的透明转换。那么我是否可以避免在极端情况下(例如需要临时时)从 std::string 分配/复制数据?考虑一下:

class A {
public:
A(const char* p) : p_{std::strdup(p)} { }
~A() { free(p_); }

A& append(const A&);

private:
char* p_;
};

现在在下面的代码中:

A a;
a.append("test");

将创建一个临时对象,分配和复制数据。那么它将立即被销毁。问题是,有没有办法在不创建每个函数的版本的情况下避免这种情况,例如 A& append(const char*)。我还想支持 std::string 的透明转换,这样它会自动成为每个函数的 3 个版本。

以下方法会产生什么效果:

class A {
public:
A(const char* p) : p_{std::strdup(p)} { }
A(const char* p) &&
: p_{p} {
}

~A() { free(p_); }
~A() && { /* nothing */ }

A& append(const A&);

private:
char* p_;
};

如果这不起作用,我可以应用什么策略来解决这个问题?

最佳答案

What effects will the following approach have:

A(const char* p) &&
~A() &&

最有可能的影响是编译错误,因为标准不允许在 c/d-tor 上使用引用限定符。

我建议实现 A::c_str就像字符串一样,并使用模板中的以下助手:

template<class Str>
const char* c_str_help(const Str& str) {
return str.c_str();
}
const char* c_str_help(const char* str) {
return str;
}

class A {
// ...

const char* c_str() const { return p_; }

template<class Str>
A& append(const Str& str) {
const char* s = c_str_help(str);
// implement using const char* s
}
};

PS:我建议使用 unique_ptr<char, void(*)(void*)>而不是裸指针,实现起来更容易。

关于c++ - 避免对临时对象、右值析构函数进行不必要的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616948/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com