gpt4 book ai didi

c++ - 跨流行工具链的标准容器重新分配乘数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:01 25 4
gpt4 key购买 nike

std::basic_stringstd::vector 等容器在内部容量用完时执行自动重新分配。该标准规定,在重新分配后,.capacity() >= .size()

主流工具链在执行重新分配时使用的一些实际乘数是什么?


更新

到目前为止,我有:

Dinkumware: 1.5 (ships with MSVS and possibly ICC)

GNU libstdc++: 2 (ships with GCC and possibly ICC)

RW/Apache stdcxx: 1.618 (aka φ)

STLport: 2

最佳答案

旧问题的新答案。

基本原理:可以通过编程方式和在线编译器相对轻松地回答答案。这是一个可以帮助您回答这个问题的程序:

#include <climits>
#include <cstddef>
#include <cstdlib>
#ifndef _MSC_VER
# include <cxxabi.h>
#endif
#include <iostream>
#include <memory>
#include <string>
#include <typeinfo>
#include <type_traits>
#include <limits>
#include <vector>
#include <string>

template <typename T>
std::string
type_name()
{
typedef typename std::remove_reference<T>::type TR;
std::unique_ptr<char, void(*)(void*)> own
(
#ifndef _MSC_VER
abi::__cxa_demangle(typeid(TR).name(), nullptr,
nullptr, nullptr),
#else
nullptr,
#endif
std::free
);
std::string r = own != nullptr ? own.get() : typeid(TR).name();
if (std::is_const<TR>::value)
r += " const";
if (std::is_volatile<TR>::value)
r += " volatile";
if (std::is_lvalue_reference<T>::value)
r += "&";
else if (std::is_rvalue_reference<T>::value)
r += "&&";
return r;
}

template <class C>
void
test()
{
C c;
std::cout << type_name<C>() << ":\n";
std::size_t c0 = c.capacity();
std::cout << " Initial capacity is " << c0 << '\n';
c.resize(c0);
for (int i = 0; i < 10; ++i)
{
c.push_back(typename C::value_type{});
std::size_t c1 = c.capacity();
if (c0 != 0)
{
float f = static_cast<float>(c1)/c0;
std::cout << " growth factor appears to be " << f << '\n';
}
c0 = c1;
c.resize(c0);
}
}

int
main()
{
test<std::vector<int>>();
test<std::string>();
}

大部分的复杂性都没有必要,因为它只是为了让 type_name 正常工作。

libstdc++:

http://melpon.org/wandbox/permlink/njaIG2uiR2vlCLZz

似乎对 vector 和字符串都给出了可靠的 2。

对比:

http://webcompiler.cloudapp.net

对于 vector 和字符串都非常接近 1.5。

libc++

http://melpon.org/wandbox/permlink/mXshrLJHgNuvE1mD

vector 和字符串都非常接近 2。

请注意,此程序还告诉您 string 的短字符串缓冲区是多少:libstdc++ 和 VS 均为 15,libc++ 为 22。

关于c++ - 跨流行工具链的标准容器重新分配乘数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5404489/

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