引用std :: basic_string使用自定义分配器作为std :: string的常量对象的字符串的特化而没有开销?

时间:2013-05-01 15:48:57

标签: c++ c++11 stl casting

给定类std::basic_string<char, std::char_traits<char>,my_allocator<char> >的对象,如何将它传递给第三方函数,该函数需要对类std::string的对象进行常量引用而不进行任何复制?

我在想的是如果我们假设一个无状态分配器,那么理论上,两种类型在运行时应该完全相同。因此,人们可以简单地重新解释转换类型,例如:

// my_allocator template is some place else...
typedef std::basic_string< char, std::char_traits<char>,
                           my_allocator<char> > my_string;

void third_party_foo(const std::string &s);

int main()
{
    const my_string str = "Hello, world!";
    third_party_foo(*(const std::string *)&str);
}

鉴于一个具有状态的分配器(我们可以从C ++ 11开始),我认为这更危险,因为运行时这些类的大小和布局可能不同。如果我到目前为止是正确的,那么让我们说两个类的对象的大小是相同的,在这种情况下,我可以假设分配器状态适合于某些本来可以填充的区域,在这种情况下,第一种方法可以工作。

实际上,我用这种方法将自己置于危险之中?是否存在任何不带任何运行时开销的替代方案(当然不需要更改第三方接口和/或放弃使用自定义分配器的字符串)?

1 个答案:

答案 0 :(得分:4)

你没有。通过使用自定义分配器,您使用std::string中的不同类型。并且在C ++中没有(合法的)方式来转换它而没有副本。您认为可能工作的任何内容都不会得到C ++标准的保证。

所以你必须接受你需要一份副本。

相关问题