C++ STL字符串中的别名

C++ STL字符串中的别名,c++,stl,C++,Stl,我在std::basic_字符串类中找到了这段代码 union _Bxty { // storage for small buffer or pointer to larger one _Elem _Buf[_BUF_SIZE]; _Elem *_Ptr; char _Alias[_BUF_SIZE]; // to permit aliasing } _Bx; 我不明白Alias如何允许实际的别名。搜索一无所获。我很好奇这个成员是否可以毫无问题地删除

我在std::basic_字符串类中找到了这段代码

union _Bxty
    {   // storage for small buffer or pointer to larger one
    _Elem _Buf[_BUF_SIZE];
    _Elem *_Ptr;
    char _Alias[_BUF_SIZE]; // to permit aliasing
    } _Bx;

我不明白Alias如何允许实际的别名。搜索一无所获。我很好奇这个成员是否可以毫无问题地删除。

这段代码是实现的一部分,这意味着它可能依赖于非常肮脏的技巧。基本思想是,根据字符串大小,
\u Buf
\u Ptr
是有效的。但问题是:这两者中哪一个是活跃的?您无法查看其中任何一个的内容来找出它,因为您可能违反了“仅读取活动”规则(这是别名的一种特殊情况)

但是,无论两个成员中的哪一个处于活动状态,您都可以访问
\u Alias
。特别是,您可以
memcpy
复制它,以便在不知道memcpy是什么的情况下,memcpy指针或memcpy字符


最糟糕的是缺少
*sizeof(\u Elem)
\u Alias[]
大小。我敢打赌,对于
std::wstring
,有一个对
\u Alias
的越界访问权限。这不是MSVC++上的一个硬错误,而且在
std::wstring中,未定义的行为不算在内。

我不知道它实际上是做什么的,但是删除它实际上对内存使用没有影响。对于
std::string
\u Elem
char
,因此
\u Elem\u Buf[\u Buf\u SIZE]
的大小基本上与
char\u Alias[\u Buf\u SIZE]
相同,因此这两种类型的合并不需要任何额外的空间。您必须了解它在代码的其余部分中是如何使用的,才能知道它的实际用途。您不是认真地建议编辑MSVC++头以从
std::string
中删除成员吗?因为这是一个非常糟糕的主意。当然,我不会考虑更改MSVC标题。我想知道使用这种保护的实际想法字符串t2(“你好”)
\u Bx
中的第一种情况下,数据将存储为
{{u Buf=0x009afb90“p k”\u Ptr=0x00eb1a70“您好,这是test”\u Alias=0x009afb90“p k”}
在第二种情况下,它看起来像
{u Buf=0x009afb68“您好”\u Ptr=0x6C6548\u Alias=0x009afb68“您好”}
因此,如果
\u Ptr
已初始化,则两个数组的地址都在前四个字节中,如果
\u Ptr
未初始化,则两个数组都将具有实际字符串。因此,我们不能使用
\u别名
,因为它与使用
\u Buf
基本相同。也许我错过了什么?@Richer:是的,
std::wstring