gpt4 book ai didi

c++ - 其中之一与其他不同:为什么 std::vector::size 是根据所有主要标准库实现的指针实现的?

转载 作者:行者123 更新时间:2023-12-01 14:04:25 24 4
gpt4 key购买 nike

在 Godbolt 上随机玩(就像一个人一样)我发现 std::vector::size()被实现为指针的差异,而我期望它只返回一个类数据成员。 std::vector::capacity()类似。奇怪的是,所有其他标准容器(除了 std::deque )都将大小存储为数据成员。偶std::string在 libstdc++ 和 Microsoft 的 STL 上,将其大小存储为数据成员(在 libc++ 上,看起来大小信息存储已使用 SSO 信息进行了优化,但仍显式存储了大小,而不是将其计算为指针的差异)。

Here is the godbolt link使用 libc++、libstdc++ 和 microsoft 的 STL 上所有容器的大小。部分摘录如下:

f_vec4:  //std::vector<std::int32_t>
mov rax, qword ptr [rdi + 8]
sub rax, qword ptr [rdi]
sar rax, 2
ret
f_vec8: // std::vector<int64_t>
mov rax, qword ptr [rdi + 8]
sub rax, qword ptr [rdi]
sar rax, 3
ret

f_list:
mov rax, QWORD PTR [rdi+16]
ret

f_map:
mov rax, QWORD PTR [rdi+40]
ret

为什么是 std::vector::size唯一的容器大小实现为指针差异,而所有其他容器存储它们的大小?标准中有什么吗?是优化吗?

最佳答案

why is std::vector::size implemented in terms of pointers on all major standard library implementations?



因为可以用指针减法来实现。因为标准库实现者选择这样做。

Is is something in the standard?



不。我确定将尺寸存储为成员是符合标准的。

What is weird is that all other standard containers (except std::deque) store the size as a data member.



这不足为奇。除了数组之外,没有其他数据结构可以使用指针作为迭代器。
std::string被实现为一个数组,因此它也可以使用指针减法。如果没有这样做,那是因为实现者选择不这样做。这可能是也可能不是由于与小字符串优化相关的便利。

关于c++ - 其中之一与其他不同:为什么 std::vector::size 是根据所有主要标准库实现的指针实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61268472/

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