C++ 方法积累

C++ 复制代码
std::numeric_limits<UInt32>::max()

placement new

用于控制分配空间

cpp 复制代码
        PostingListInMemory * posting_list = arena.alloc<PostingListInMemory>();
        new (posting_list) PostingListInMemory();
cpp 复制代码
/// placement new;
    PostingListInMemory & operator=(const PostingListInMemory & other)
    {
        if (this != &other)
        {
            this->~PostingListInMemory();

            if (other.m.set.type != 0)
                new (&m.bitmap) roaring::Roaring(other.m.bitmap);
            else
                new (&m.set) PostingListSet(other.m.set);
        }
        return *this;
    }


    PostingListInMemory * local_posting_list = external_posting_list;
    if (!local_posting_list)
    {
        local_posting_list = arena.alloc<PostingListInMemory>();
        new (local_posting_list) PostingListInMemory();
    }
slignas union
cpp 复制代码
struct alignas(8) PostingListInMemory
{
    union M
    {
        PostingListSet set;
        roaring::Roaring bitmap;

        M() : set() {}

        ~M()
        {
            if (set.type != 0)
                bitmap.~Roaring();
        }
    } m;

这段代码定义了一个名为 PostingListInMemory 的结构体,其中包含了一个匿名联合体(union)M。在C++中,联合体是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型,但同一时间只能存储其中的一种类型。

联合体 M 的定义

联合体 M 包含了两个成员:

  1. PostingListSet set;

  2. roaring::Roaring bitmap;

并且有一个构造函数和一个析构函数。

联合体的作用

在这个上下文中,联合体 M 允许 PostingListInMemory 结构体在相同的内存位置存储两种不同类型的数据结构,即 PostingListSet 和 roaring::Roaring。这意味着 PostingListInMemory 的实例可以根据需要在两种表示方法之间切换,而不需要额外的内存开销。

构造函数和析构函数

构造函数 M():初始化联合体的 set 成员。

析构函数 ~M():这是一个自定义的析构函数,它的目的是确保在销毁 M 联合体时,正确地调用所存储对象的析构函数。这里使用了一个条件判断 if (set.type != 0) 来检查当前联合体中存储的是哪个对象。如果 set.type 不为0,这意味着 set 成员被使用过,因此需要显式调用 bitmap 的析构函数。这种做法是为了避免在销毁时调用错误的析构函数,因为联合体中的成员共享内存空间。

注意事项

这种使用联合体和条件析构的做法是比较底层的操作,需要对内存管理和对象生命周期有深入的理解。

在现代C++中,通常推荐使用智能指针或其他RAII(Resource Acquisition Is Initialization)技术来管理资源,以避免这类复杂的内存管理问题。

此外,alignas(8) 指令确保了整个 PostingListInMemory 结构体按8字节对齐,这可能是为了优化性能或满足某些硬件平台的要求。

总之,这段代码展示了一种在C++中使用联合体来实现类型双关(type punning)的方法,允许在相同的内存位置存储和使用两种不同的数据结构。

相关推荐
宵时待雨1 分钟前
C++笔记归纳9:模板进阶
开发语言·数据结构·c++·笔记
爱装代码的小瓶子5 分钟前
【c++与Linux进阶】轻量化进程与虚拟地址和页表
linux·开发语言·c++
零号全栈寒江独钓23 分钟前
visual studio编译wxWidgets
c++·visual studio
努力中的编程者25 分钟前
哈希表(C语言底层实现)
c语言·数据结构·c++·算法·哈希算法·散列表
mjhcsp28 分钟前
C++ 迭代加深搜索(IDDFS):从原理到实战的深度解析
c++·深度优先·迭代加深
摆烂小白敲代码37 分钟前
【数据结构与算法】汉诺塔问题(C++)
c语言·开发语言·数据结构·c++·算法·hanoi·汉诺塔问题
Trouvaille ~43 分钟前
【递归、搜索与回溯】专题(八):记忆化搜索——从暴力递归到动态规划的桥梁
c++·算法·leetcode·青少年编程·面试·蓝桥杯·动态规划
刚入坑的新人编程1 小时前
C++qt(3)-按钮类控件
开发语言·c++·qt
乐观勇敢坚强的老彭1 小时前
本周C++编程课笔记:for循环练习
java·c++·笔记
娇娇yyyyyy1 小时前
C++ 网络编程(22) beast网络库实现websocket服务器
网络·c++·websocket