我正在寫一些代碼,它將一些數據結構存儲在一個特殊的命名二進制節中。這些都是相同結構的實例,它們分散在許多C文件中,並且不在彼此的範圍內。通過將它們全部放在指定的部分中,我可以遍歷所有這些部分。如何獲取指向MSVC中二進制節的指針?
在GCC,我使用_ 屬性 _((節(...)),加上一些特別命名的extern指針,其是由鏈接神奇填寫下面是一個簡單的例子:
#include <stdio.h>
extern int __start___mysection[];
extern int __stop___mysection[];
static int x __attribute__((section("__mysection"))) = 4;
static int y __attribute__((section("__mysection"))) = 10;
static int z __attribute__((section("__mysection"))) = 22;
#define SECTION_SIZE(sect) \
((size_t)((__stop_##sect - __start_##sect)))
int main(void)
{
size_t sz = SECTION_SIZE(__mysection);
int i;
printf("Section size is %u\n", sz);
for (i=0; i < sz; i++) {
printf("%d\n", __start___mysection[i]);
}
return 0;
}
我試圖找出如何在MSVC中做到這一點,但我畫了一個空白。我從編譯器文檔中看到,我可以使用__pragma(section(...))聲明該部分,並聲明數據在使用__declspec(allocate(...)),但我看不到如何在運行時獲得指向該部分的開始和結束的指針。
我在網絡上看到了一些與MSVC中的_ 屬性 _((構造函數))相關的例子,但是它似乎像是針對CRT的黑客攻擊,而不是獲取指向開頭/結尾的指針的一般方法部分。有人有主意嗎?
請問爲什麼要控制二進制文件命名呢? – Reinderien 2010-09-27 21:42:45
這是一個高性能的儀器框架。想象一下printf(format,args ...)調用,其中所有格式字符串都存儲在二進制部分中,唯一記錄的是參數和查找值。參數替換髮生在後處理中。 – 2010-09-27 21:57:00
這是一個更好的例子,它允許您通過重新鏈接而不是重新編譯(並可能重新生成一些代碼)來添加模塊。如果你可以把整個部分當作一個結構體的數組,那麼你可以迭代它並對每個入口執行一些操作,比如調用'cur_entry [i] - > init(&cur_entry)'。您也可以使用關於內存使用模式的特殊知識來優化分頁和緩存局部性。通常不是Windows相關的(我知道的),但這對於哈佛架構處理器也是必需的。 – nategoose 2010-09-27 23:16:15