Basic_string 类型传参是怎么传递的

如图所示basic_string类型初始化,看汇编代码是进行堆栈传参。
1.如果是结构体如何构造对应的结构体,查看xcode c++库代码没看到libc++.1.dylib对应的源码。
2.如何知道内容进行basic_string init后存储那在哪里。(x1存储了数组的指针,不明白为什么是x1)

1 个赞

怎么就是堆栈传参了, 明明是X0, 寄存器传的, X0是this, this就是std::string的地址, 正好放在栈顶而已 看错, 是SP+0x20

结构大概是

struct string
{
    char* ptr;
    uint8_t len;
    char smallBuffer[16];
};

如果长度 < 16, 就放在smallBuffer里, 否则就malloc

所以你会看到他的析构函数是

if (this->ptr != this->smallBuffer) free(ptr);

感谢回复!!

打印0x13758d7b0 指向的内容确实是字符串。0x60也是长度。

(lldb) x/30 $x1
0x16fd6ded0: 0x3758d7b0 0x00000001 0x00000060 0x00000000
0x16fd6dee0: 0x00000070 0x80000000 0x616d5151 0x72506c69

请问你这个结构是怎么确定的?对应是哪个源码? 我看了basic_string的源码没对应上。。。。

看汇编啊, 不同的stl实现都不同

soga!!! :+1:

0x16fd6ded0: 0x3758d7b0 0x00000001 0x00000060 0x00000000
0x16fd6dee0: 0x00000070 0x80000000 0x616d5151 0x72506c69

从你这里看, 结构就是

struct string
{
    char*       ptr;                // 0x00
    uint32_t    len;                // 0x08
    uint32_t    pad;                // 0x0C
    uint32_t    cap;                // 0x10
    uint32_t    flags;              // 0x14
    char        smallBuffer[16];    // 0x18
};
2 个赞

我猜测你要看的这部分源码应该在LLVM libcxx

http://libcxx.llvm.org/index.html

大佬 太强啦. 膜膜膜