g ++ создает несколько символов const? - PullRequest
4 голосов
/ 23 апреля 2010

В одном из моих файлов заголовков (C ++) я изменил

   #define TIMEOUT 10

к более (?) C ++ способу:

const int TIMEOUT = 10;

Однако, похоже, g ++ (v 4.4.3) теперь включает этот символ несколько раз в двоичном виде.

$ nm -C build/ipd/ipd |head
08050420 T ToUnixTime
08050470 T ParseTime
080504c0 T ParseISOTime
080518e4 r TIMEOUT
080518ec r TIMEOUT
080518f4 r TIMEOUT
080518fc r TIMEOUT
080503e0 T HandleMessage

Как получилось?

Ответы [ 3 ]

6 голосов
/ 23 апреля 2010

Вы, вероятно, включили свой заголовок в четыре отдельных единицы перевода (файлы .cpp).

Переменные const-пространства области имен не объявлены extern неявно static, поэтому будет один для каждого переводаблок, в который включен заголовок.

3 голосов
/ 23 апреля 2010

Попробуйте вместо enum. Это очень похоже на #define, на него нельзя ссылаться, и гарантированно нигде не будет места.

enum { TIMEOUT = 10 };

Но если это не доставит вам хлопот, я бы так или иначе не беспокоился об этом. Путь const int очень хорош, и мы говорим о 16 байтах, отдаче или взятии.

0 голосов
/ 23 апреля 2010

Компилятор, возможно, обнаружил, что копирование символа более эффективно, чем обращение к нему. Это связано с модификатором const.

Во многих случаях загрузка регистра с «немедленным» значением (хранящимся в исполняемом файле) более эффективна, чем загрузка из места в ПЗУ (постоянное запоминающее устройство), которое использует косвенную адресацию.

Я бы не стал беспокоиться о дублировании постоянного целого числа во многих объектных файлах, если только он не делает файлы слишком большими для размещения на жестком диске. Кроме того, объектные файлы являются временным хранилищем данных до тех пор, пока не будут сгенерированы исполняемый файл или библиотеки.

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

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