2010-04-22 2 views
4

В одном из моих заголовка (C++) файлы я изменилg ++ создает несколько символов const?

#define TIMEOUT 10 

к более, как C++ (?):

const int TIMEOUT = 10; 

Кажется, однако, г ++ (об 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 

Почему?

+0

Я думаю, что чем больше C++-путь будет 'static const int TIMEOUT = 10;' –

+0

@John Dibling: Нет. Объекты 'const' в C++ имеют внутреннюю привязку по умолчанию. 'static' не будет иметь никакого эффекта. – AnT

ответ

6

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

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

+0

Итак, должен ли я просто сохранить #define? – nissen

+0

@nissen: Если вы действительно хотите ровно одну копию, объявите ее 'extern' в заголовке, а затем определите ее в одном файле cpp или для целочисленных констант используйте трюк перечисления, который показывает Potatoswatter в его ответе. –

3

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

enum { TIMEOUT = 10 }; 

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

0

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

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

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

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

Смежные вопросы