C++中POD类的快速默认排序
Fast default ordering for POD class in C++
假设我在C++中有一些POD struct Foo
,我想把它放入像set<Foo>
这样的有序容器中。我不在乎使用哪种排序,只在乎它是一致的和快速的。最好的方法是什么?
更具体地说,假设我在一台带有sizeof(long)==8
的64位机器上。假设类别为:
struct Foo{
long key; //8 bytes : 8 total
int fum; // 4 bytes : 12 total
short n; // 2 bytes : 14 total
short n[3]; //6 bytes : 20 total
char bar[5]; // 5 bytes : 25 total
char name[23]; //22 bytes : 47 total
char padding[1]; // 1 byte : 48 total
}
CCD_ 4字段只是为了确保大小是8的倍数。
请注意,sizeof(Foo)
是48,因此它的内容可以用6个unsigned long
s表示,这显然是进行比较的最佳方式,而不是遍历每个字段。
编译器能自动为我做这件事吗?或者,我是否必须用字段unsigned long data[8]
定义union
,或者在Foo
的operator<
方法中将Foo *
强制转换为unsigned long *
?
请注意,如果没有填充字段,则必须生成5个unsigned long
比较,然后生成long
、short
和char
比较。这整件事有点乱。
这个问题肯定一直都会出现,所以我猜有一些最好/最好的方法来处理它。
如果您想使用结构实际值进行比较,最好定义一个operator<
,它具有更多的逻辑,并在字段之间提供某种逻辑排序。
如果您只想对对象进行排序以便快速访问,您可以只保留指针。这些只是数字,可以排序。
如果您想使用实际的结构数据,但不关心成员之间的任何排序,则可以将memcmp与sizeof(Foo)
一起使用。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 二叉排序树无法编译
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 初始化具有非默认构造函数的std::数组项的更好方法
- 计算排序向量的向量中唯一值的计数
- 何时提供默认参数作为模板参数
- 是默认情况下分配给char数组常量的值
- 为什么<wstring>使用自定义 wcscmp 和 wmemcmp 比较器对向量进行排序比默认快得多?
- 在不使用默认算法的情况下对字符串的 std 向量进行排序
- 默认的 CListCtrl 数据即将排序
- 更改 CMFCListCtrl 的默认排序箭头
- c++是否有一个默认的数据类,用于以合理的速度对基于索引的访问进行排序
- C++中POD类的快速默认排序
- 带有默认参数的函数的c++部分排序