[英]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
}
padding
字段只是為了確保大小是8的倍數。
請注意, sizeof(Foo)
為48,因此其內容可以用6個unsigned long
s表示,這顯然是進行比較的最佳方法,而不是遍歷每個字段。
編譯器可以自動為我執行此操作嗎? 還是我必須要么定義一個union
有場unsigned long data[8]
或投下Foo *
到unsigned long *
在我的operator<
法Foo
?
請注意,如果沒有填充字段,則必須生成5個unsigned long
比較,然后是long
, short
和char
比較的比較。 這整個事情有點混亂。
這個問題必須一直出現,所以我猜想有一些最好的/最好的方法來處理它。
如果要使用struct實際值進行比較,則最好定義一個operator<
,它具有更多的邏輯並在字段之間給出某種邏輯順序。
如果只希望對對象進行排序以進行快速訪問,則只需按住指針即可。 這些只是數字,並且可以排序。
如果您想使用實際的struct數據,但不關心成員之間的任何排序,則可以將memcmp與sizeof(Foo)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.