簡體   English   中英

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 
 }

padding字段只是為了確保大小是8的倍數。

請注意, sizeof(Foo)為48,因此其內容可以用6個unsigned long s表示,這顯然是進行比較的最佳方法,而不是遍歷每個字段。

編譯器可以自動為我執行此操作嗎? 還是我必須要么定義一個union有場unsigned long data[8]或投下Foo *unsigned long *在我的operator<Foo

請注意,如果沒有填充字段,則必須生成5個unsigned long比較,然后是longshortchar比較的比較。 這整個事情有點混亂。

這個問題必須一直出現,所以我猜想有一些最好的/最好的方法來處理它。

如果要使用struct實際值進行比較,則最好定義一個operator< ,它具有更多的邏輯並在字段之間給出某種邏輯順序。

如果只希望對對象進行排序以進行快速訪問,則只需按住指針即可。 這些只是數字,並且可以排序。

如果您想使用實際的struct數據,但不關心成員之間的任何排序,則可以將memcmpsizeof(Foo)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM