gpt4 book ai didi

C++ std::unique_ptr:为什么 lambda 没有任何尺寸费用?

转载 作者:IT老高 更新时间:2023-10-28 12:30:43 29 4
gpt4 key购买 nike

我正在阅读“有效的现代 C++”。在 std::unique_ptr 相关的条目中声明如果自定义删除器是无状态对象,则不会产生大小费用,但如果它是函数指针或 std::function 尺寸费用发生。你能解释一下为什么吗?

假设我们有以下代码:

auto deleter_ = [](int *p) { doSth(p); delete p; };
std::unique_ptr<int, decltype(deleter_)> up(new int, deleter_);

据我了解,unique_ptr 应该有一个 decltype(deleter_) 类型的对象,并将 deleter_ 分配给该内部对象。但显然这不是正在发生的事情。你能用尽可能小的代码示例解释这背后的机制吗?

最佳答案

unique_ptr 必须始终存储其删除器。现在,如果删除器是一个没有状态的类类型,那么 unique_ptr 可以使用 empty base optimization这样删除器就不会使用任何额外的空间。

具体执行方式因实现而异。例如,libc++和 MSVC 将托管指针和删除器存储在 compressed pair 中。 ,如果涉及的类型之一是空类,它会自动为您提供空基优化。

来自上面的 libc++ 链接

template <class _Tp, class _Dp = default_delete<_Tp> >
class _LIBCPP_TYPE_VIS_ONLY unique_ptr
{
public:
typedef _Tp element_type;
typedef _Dp deleter_type;
typedef typename __pointer_type<_Tp, deleter_type>::type pointer;
private:
__compressed_pair<pointer, deleter_type> __ptr_;

libstdc++ stores the twostd::tuple 中,一些谷歌搜索表明他们的 tuple 实现采用空基优化,但我找不到任何如此明确说明的文档。

无论如何,this example演示 libc++ 和 libstdc++ 都使用 EBO 来减少具有空删除器的 unique_ptr 的大小。

关于C++ std::unique_ptr:为什么 lambda 没有任何尺寸费用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33289652/

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