通過彙編看vs2015下c 各標準庫的實現原理

2021-07-27 02:21:00 字數 1202 閱讀 3307

1.std::vector

共佔12位元組,為3個指標,分別指向開頭,資料的結尾,預留空間的結尾

example:

std::vectorv ;

則                size(v) == 12

&v == 0x1000(右邊為可能值)

[0x1000] == 0x2000(指向開頭)

[0x1004] == 0x200c(指向資料結尾)

[0x1008] == 0x2010(指向預留空間結尾)(右邊為可能值)

[0x2000] == 2

[0x2004] == 3

[0x2008] == 4

2.std::queue

共佔20位元組,最後乙個4位元組儲存大小

3.std::forward_list

共佔4位元組,為乙個指標,指向乙個結構體,結構體為8位元組,為乙個向後指標欄位和乙個資料儲存字段,最後乙個向後指標為null

example:

std::forward_listv ;

則                size(v) == 4

v == 0x1000(右邊為可能值)

[0x1000] == 0x2000(指向下乙個結構體)(右邊為可能值)

[0x1004] == 2(資料)

[0x2000] == 0(結尾)

[0x2004] == 3(資料)

4.std::list

共佔8位元組,為乙個指標和乙個整數,指標指向頭結點,整數表示結點個數。結構體為12位元組,依次為乙個向後指標,乙個向前指標和乙個儲存資料的字段

example:

std::listv ;

則                size(v) == 8

&v == 0x1000(右邊為可能值)

[0x1000] == 0x3000

[0x1004] == 2(結點個數)

[0x3000] == 0x4000(頭結點)

[0x3004] == 0x5000

[0x3008] == unused

[0x4000] == 0x5000(第乙個結點)

[0x4004] == 0x3000

[0x4008] == 2

[0x5000] == 0x3000(第二個結點)

[0x5004] == 0x4000

[0x5008] == 3

ifcopenshell在VS2015下的編譯

源起 今天使用 ifcopenshell的ifcconvert 因為是開源的所以就想自己編譯下,編譯過程中遇到不少問題,因此記錄下來 什麼是ifcopenshell?ifcopenshell是乙個開源 lgpl 軟體庫,可幫助使用者和軟體開發人員使用 ifc檔案格式。開始前的準備 visual st...

Windows下VS2015配置FFTW3庫

前些天重灌了我的電腦系統,這也意味著我還要重灌我電腦中的很多軟體。但有些軟體不是簡單的用安裝包傻瓜式的一路狂點下一步就可以完成的,還需要進行相應的配置。例如進行快速傅利葉變換所需要用到的fftw庫等。在配置fftw庫的時候參考的了網上的很多資料,各家所雲不盡相同,走了一些彎路,在這裡記錄下我親測可行...

VS2015下編譯不通過解決辦法

vs2015編譯jsontest工程,由於用到c 11,所以vs2010已經不能滿足要求,因此重新安裝vs2015。安裝結束後編譯彈出大量問題,在網上查發現,是因為sdk的版本配置不匹配造成的。解決辦法 在下圖中的工具平台集,選擇已有的版本 在下圖中重新設定sdk版本,就是已有的就好。重新編譯後來發...