小编Jus*_*ire的帖子

C++ 编译时一致标识符生成

我需要实现一个类型索引结构,该结构可以正确且一致地识别项目中的每种类型。

使用类似的东西的问题std::type_index是它需要在不同的编译单元之间保持一致。我需要它在编译单元之间保持一致,因为我将在运行时将共享库作为子模块加载(因此它们不会链接到主模块),并且它们都应该具有相同类型的相同索引,并且如果我使用std::type_index或者自定义索引生成函数,每个编译单元都有自己的索引生成实现,因此索引可能不一致。

是否有任何模板方法可以为跨编译单元一致的类型生成唯一索引(例如,在第一次编译和第二次编译时TypeA有索引)?1

是否有任何工具可以让我将源代码输入并从中一致地生成硬编码索引?

c++

5
推荐指数
0
解决办法
248
查看次数

为什么位置不变性对于 std::function 很重要?

我一直在研究 GCC 的实现std::function(在调试时到达那里,然后偏离了主题)。

据我所知,它在本地存储中存储小型类型,并且任何不适合它的内容都通过 new 运算符分配。然而,构造函数也会检查元函数__location_invariant,它是特征的包装器std::trivially_copyable,如果它不是“位置不变”,它也会在堆上分配它。

我不完全理解它为什么这样做,因为据我了解 ::new (storage) T(args) 应该提供与就地构造函数相同的结果 new T(args) ,但就地构造函数不分配任何内存。

例如,如果它使用单个引用计数对象来存储太大而无法放入本地存储的“位置不变”类型,那么对我来说会更有意义,因为这会减少分配和复制的数量。由于非不变对象每次都被分配和复制,因此它们是“位置相关的”,它们不能全部引用相同的存储。

该实现似乎只是堆分配任何不适合和/或不是位置不变的东西(至少我没有看到它这样做?),所以我很困惑为什么它需要检查位置不变性,如果功能上没有明显差异。

c++

4
推荐指数
1
解决办法
197
查看次数

标签 统计

c++ ×2