C ++ инициализировать переменную в разделе .data - PullRequest
0 голосов
/ 03 февраля 2020

Я спрашиваю себя, как вы могли бы улучшить код. Если возникла следующая проблема:

int i = 10;
int s = i * 12;

int main(){ }

Когда вы смотрите на код в формате PE, вы замечаете, что ни i, ни s не объявлены в сегменте .data, несмотря на то, что их значение могло иметь был предварительно рассчитан. Они инициализируются во время выполнения.

Здесь у меня есть пример другого кода, который имеет такое же явление. Значения также были объявлены, как в примере выше

Просмотр в отладчике перед передачей EntryPoint:

0133BF7C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................  
0133BF8C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................  

После передачи EntryPoint:

0133BF7C  E9 01 00 00 DF 02 00 00 64 00 00 00 00 00 00 00  é...ß...d.......
0133BF8C  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................  

Как мне объявить переменная с начальным значением в секции .data в C ++ для экономии драгоценного времени вычислений?

Или секция .data никогда не инициализируется чем-либо до начала выполнения?

1 Ответ

2 голосов
/ 03 февраля 2020

Если это константы времени компиляции, используйте constexpr.

constexpr int i = 10;
constexpr int s = i * 12;

Начиная с C ++ 17, это также inline переменные, поэтому вы можете объявить их в заголовочный файл и не беспокойтесь о наличии нескольких определений.

Если они не являются константами, но вы хотите, чтобы они были инициализированы константами, то вы можете по крайней мере использовать static, чтобы сделать их внутренними связями, что делает оптимизацию более вероятно, что произойдет. Начиная с C ++ 20, вы можете использовать constinit, чтобы указать, что переменная должна иметь stati c инициализацию, но может быть изменена позже в программе.

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