我一直在閱讀數據結構對齊文章,但我無處可去。也許事情太複雜了,我不明白。我也遇到了數據結構填充這也是對齊數據所必需的。如何將數據結構填充添加到struct usb_ep?另外,如何確保每次執行kmalloc時要讀取的數據都應該位於內存偏移量爲4的倍數?如何使用kmalloc執行數據結構對齊?
0
A
回答
3
關於對齊,kmalloc會正確對齊結構。如果你有一個4字節的變量,它將是4字節對齊的,如果你有一個8字節的變量,它將被對齊8字節。理解對齊是需要填充的原因。
你不想得到的是你的結構中的變量之間的garbade填充。你可以用pragma pack directive(可能是最簡單的)或手動添加填充來實現。
例
struct usb_ep
{
short a; /* 2 bytes*/
int b; /* 4 bytes*/
short c; /* 2 bytes*/
};
所有元件的大小是8個字節,但是由於對準要求,大小將12bytes。內存佈局會是這樣:
short a - 2 bytes
char pad[2] - 2 bytes of padding
int b - 4 bytes
short c - 2 bytes
char pad[2] - 2 bytes of padding
爲了得不到任何填充物,或增加結構的大小,可以以滿足對齊要求重新排列元素。
即具有結構:
struct usb_ep
{
short a; /* 2 bytes*/
short c; /* 2 bytes*/
int b; /* 4 bytes*/
};
將有8個字節的尺寸,以及用於添加填充沒有要求。
1
這來自http://minirighi.sourceforge.net/html/kmalloc_8c.html
void * kmemalign (size_t alignment, size_t size)
Allocate some memory aligned to a boundary.
Parameters:
alignment The boundary.
size The size you want to allocate.
Exceptions:
NULL Out-of-memory.
Returns:
A pointer to a memory area aligned to the boundary. The pointer is a aligned_mem_block_t pointer, so if you want to access to the data area of this pointer you must specify the p->start filed.
Note:
Use kfree(void *ptr) to free the allocated block.
的最佳方式墊場的結構是按大小來聲明變量。所以你的第一個,然後是最小的。
struct example {
double amount;
char *name;
int cnt;
char is_valid;
};
這並不總是最後的結構邏輯連接的項目,但通常會給予最緊湊和最方便的內存使用情況。
你可以在你的結構聲明中使用填充字節,但是它們混淆了代碼,並不保證緊湊的結構。編譯器可以對齊4字節邊界上的每個字節,所以你可能最終得到
struct example2 {
char a;
char padding1[3];
char b;
char padding2[3];
};
服用4個字節的4個字節爲padding1,4個字節b和4個字節padding2。有些編譯器允許你指定在這種情況下會產生正確結果的打包結構。通常我只是聲明從最大到最小類型的字段並將其留在那裏。如果你需要在兩種語言/編譯器之間共享內存,那麼你需要確保結構在內存中保持一致。
相關問題
- 1. 數據結構對齊
- 2. 檢索數據結構對齊信息
- 3. 結構對齊
- 4. 如何對齊結構的數組,每個需要對齊(SSE)
- 5. kmalloc許多結構,我應該一次kmalloc全部或分別
- 6. 對齊DataFrames使數據行
- 7. 如何使用此結構在Python中執行相對導入?
- 8. C++對齊結構
- 9. C結構對齊
- 10. C結構對齊
- 11. 數據對齊結構的壓縮結構中的最後一個結構
- 12. 數據結構緩存對齊如何在L1緩存行中失效
- 13. 如何對齊結構的元素?
- 14. 如何關閉對齊網格結構
- 15. 如何在結構內部對齊__m256d?
- 16. 如何在PostgreSQL中使用JSONB數組結構執行連接
- 17. 如何使用這個數據結構?
- 18. 爲什麼數據結構對齊對於性能很重要?
- 19. 與PyOpenCL結構對齊
- 20. C vs C++結構對齊
- 21. C結構的對齊
- 22. 結構對齊問題
- 23. C結構大小對齊
- 24. C++/CLI結構/類對齊
- 25. 結構對齊建議?
- 26. 嵌套結構/數組的LLVM對齊
- 27. 如何使用qsort()對結構數組進行排序?
- 28. 如何在GCC C中獲得對齊的數組結構?
- 29. 使用結構映射執行攔截
- 30. 通過db:migrate更改結構數據庫後,Rails如何執行數據更新?
如果您使用雜注包指令,這是否意味着您不必填充? – Owen 2011-03-16 01:45:27
這是否也意味着使用kmalloc,您不必擔心數據對齊,因爲它默認已經對齊了數據? – Owen 2011-03-16 03:59:37
當然不是! kmalloc()不知道你想要分配的數據的內部信息。 – adobriyan 2011-03-16 07:22:27