缓冲区数组的用途是什么或者它存储什么?

问题描述 投票:0回答:1

我看到这段代码用于实现类似 C++

std::variant
的类型。该类用作变体存储。

缓冲区数组存储什么?

alignas(Types...) unsigned char buffer[sizeof(LargestT)];
我还在学习中,但就我的理解,也许是错误的,它存储了模板包列表的当前最大类型。

#include <new> // for std::launder()
template<typename... Types>
class VariantStorage {
    using LargestT = LargestType<Typelist<Types...>>;
    // What stores the following buffer array?
    alignas(Types...) unsigned char buffer[sizeof(LargestT)];
    unsigned char discriminator = 0;
public:
    unsigned char getDiscriminator() const {
        return discriminator;
    }
    void setDiscriminator(unsigned char d) {
        discriminator = d;
    }
    void* getRawBuffer() {
        return buffer;
    }
    const void* getRawBuffer() const {
        return buffer;
    }
    template<typename T>
    T* getBufferAs() {
        return std::launder(reinterpret_cast<T*>(buffer));
    }
    template<typename T>
    T const* getBufferAs() const {
        return std::launder(reinterpret_cast<T const*>(buffer));
    }
};

有人可以解释一下这行代码的目的是什么吗? 预先感谢您!

c++ templates std-variant
1个回答
0
投票

这个想法是变体有一个可以存储所有替代类型的缓冲区。

为此,缓冲区不仅需要与最大类型一样大(就大小而言),而且还必须具有与所有类型兼容的对齐方式。

alignas(Types...)
属性正是这样做的。

© www.soinside.com 2019 - 2024. All rights reserved.