статический символ * против #define в C ++ VS2005 - PullRequest
1 голос
/ 06 августа 2010

У меня есть большая программа с несколькими большими DLL, которые скомпилированы с MFC и / clr. Существует ограничение в 65535 глобальных записей FieldRVA в сборке. Если больше, то загрузчик выдвигает исключение. У меня уже есть активация пула строк (/GF).

У меня есть много кода, как:

static char *pSTRING_ONE = "STRING_ONE";

если я скомпилирую макрос, такой как:

#define pSTRING_ONE  "STRING_ONE"

это значительно уменьшает строку для метаданных CLR, поэтому я компилирую, но затем я получаю все проблемы использования #define.

Вопрос в том, есть ли другая альтернатива изменению статического символа * -> #define?

Ответы [ 3 ]

0 голосов
/ 06 августа 2010

Вместо того, чтобы хранить строки в сегменте данных вашей программы (поскольку у вас, очевидно, есть тонна строк), гораздо лучше иметь файл ресурсов, который содержит их. Затем просто динамически распределяйте пул строк и загружайте файл строковых ресурсов при запуске программы. Это должно полностью устранить проблему.

Если это не вариант, при условии, что они содержатся в области видимости файла, почему вы делаете строки static? Это просто способ C (и не рекомендуется в C ++) говорить «только область действия файла». const char *pSTRING_ONE = "STRING_ONE"; создаст глобальную строку для всех блоков перевода. В этом случае нужно просто создать один файл, содержащий все строки, а затем обратиться к ним через объявления extern в заголовке.

Что произойдет, если вы не используете /GF? Из ответа Bukes видно, что, объединяя строки, вы заставляете компилятор создавать один сегмент на строку.

0 голосов
/ 11 августа 2010

К сожалению, лучшим решением нашей проблемы было включение в класс нарушающего кода.

// Old Way
static char *pSTRING_ONE = "STRING_ONE";

Новый

class CFieldDefs
{
  public:
     static char *pSTRING_ONE;
}

char *CFieldDefs::pSTRING_ONE = "STRING_ONE";

Использование:

CFieldDefs:pSTRING_ONE;

Несмотря на то, что изменение было довольно утомительным, оно значительно сократило количество полей CLR fieldRVA Entries в DLL.Спасибо за вашу помощь.

0 голосов
/ 06 августа 2010

Из MSDN:

http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx

"Параметр компилятора / GF создает адресуемый раздел для каждой уникальной строки. И по умолчанию объектный файл может содержать до 65 536 адресуемых разделов. Если ваша программа содержит более 65 536 строк, используйте параметр компилятора / bigobj, чтобы создать больше разделов. "

Похоже, что / bigobj твой друг здесь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...