gpt4 book ai didi

c++ - std::string 分配策略

转载 作者:太空狗 更新时间:2023-10-29 20:46:11 24 4
gpt4 key购买 nike

我对一些基本的字符串实现有点困惑。我一直在浏览源代码以了解内部工作并学习新事物。我不能完全理解内存是如何管理的。

基本字符串实现的一些花絮

  • 原始分配器用于字符类型

    typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
  • ...然后当分配的 Rep 被放置在分配的缓冲区中时,__size 被计算为也适合字符

    size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
    void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
    _Rep *__p = new (__place) _Rep;
  • 这是从 _Rep 缓冲区中获取字符数据的方式

    _CharT* _M_refdata() throw()
    {
    return reinterpret_cast<_CharT*>(this + 1);
    }
  • 设置角色 - 一种方式

    _M_assign(__p->_M_refdata(), __n, __c);

令我困扰的是,原始分配器是 char 类型,但分配的内存可能包含一个 _Rep 对象,加上字符数据(不一定是 char 类型)

此外,为什么(或者更确切地说如何)调用 _M_refdata 知道字符数据的开始(或结束)在缓冲区中的位置(即 this+1)

编辑:this+1 是否只是将内部指针推到 _Rep 对象之后的下一个位置?

我对内存对齐和转换有基本的了解,但这似乎超出了我阅读的任何内容。

谁能帮忙,或者给我指点信息更丰富的阅读 Material ?

最佳答案

您错过了新展示位置。线路

_Rep *__p = new (__place) _Rep;

__place 初始化一个新的 _Rep 对象。之前已经为它分配了空间(意味着 placement-new 不会自行分配,它实际上只是一个构造函数调用)。

C 和 C++ 中的指针算法告诉您,this + 1 是指向 this 右边的 sizeof(*this) 个字节的指针>。由于之前已经分配了(__capacity + 1) * sizeof(_CharT) + sizeof(_Rep)字节,所以_Rep对象之后的空间用于字符数据。布局是这样的:

| _Rep |  (__capacity + 1) * _CharT  |

关于c++ - std::string 分配策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8810194/

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