Я пишу код, который хранит некоторые структуры данных в специальном именованном двоичном разделе. Это все экземпляры одной и той же структуры, разбросанные по многим файлам C и не входящие в область действия друг друга. Поместив их все в именованный раздел, я могу перебрать их все.
В GCC я использую _attribute_((section(...)) плюс некоторые внешние указатели со специальными именами, которые волшебным образом заполняются компоновщиком. Вот тривиальный пример:
#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(...)) но я не вижу, как я могу получить указатель на начало и конец раздела во время выполнения.
Я видел несколько примеров в Интернете, связанных с выполнением _attribute_((constructor)) в MSVC, но это похоже на взлом, специфичный для CRT, а не на общий способ получить указатель на начало /конец раздела. У кого-нибудь есть идеи?
cur_entry[i]->init(&cur_entry)
. Вы также можете использовать специальные знания о шаблонах использования памяти для оптимизации подкачки и локальности кэша, делая это. Обычно это не связано с Windows (насколько я знаю), но это также может потребоваться для процессоров с гарвардской архитектурой. - person nategoose   schedule 28.09.2010undefined reference to '__stop___mysection
иundefined reference to '__start___mysection
. Потребуется ли для этого какая-то магия ld script? - person speakman   schedule 27.04.2011