Увеличивают ли дополнительные определения функций / методов объем памяти программы? - PullRequest
4 голосов
/ 15 декабря 2010

В C ++ определение дополнительных методов или функций, которые не используются, приводит к увеличению объема памяти или снижению скорости выполнения?

В принципе, у меня есть несколько методов отладки утилит в классе, ни один из которыхнеобходимы для нормального использования класса.Будет ли иметь значение с точки зрения объема памяти или скорости, останутся ли эти определения, если они никогда не используются?Например:

class myClass
{
    public:

        //Something the user of this class would use
        int doSomething() {...}

        //Something used solely to make sure I wrote the class properly
        bool isClassValid() {...}
};

...

myClass classInstance();
myClass.doSomething();

Ответы [ 4 ]

2 голосов
/ 15 декабря 2010

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

Например, на Mac вы можете передать -dead_strip на ld, чтобы удалить такой мертвый код. Если вы работаете в Windows, используя Visual C ++, вы можете передать /OPT:REF в link.exe (я предполагаю, что Visual Studio автоматически настраивает ваш проект на передачу этой опции в сборках выпуска, но не в сборках отладки.)

2 голосов
/ 15 декабря 2010

Обратите внимание, что большинство операционных систем не всегда хранят весь код в памяти.Поскольку код является постоянными данными, ОС всегда может загрузить его из файла по требованию, как если бы он загружал динамические данные из свопинга.Но это не значит, что неиспользуемый код никогда не загружается, поскольку ОС загружает его не отдельными методами, а страницами.Другими словами, очень трудно предсказать, какие части вашего сегмента кода на самом деле окажутся в памяти, если вы не обладаете очень глубокими знаниями своей ОС и структуры своего сегмента кода.Единственное, что можно сказать наверняка, - это то, что ваш код может потреблять меньше физической памяти, чем его фактический размер.

Что касается скорости выполнения, ответ, я думаю, нет.Это может увеличить скорость загрузки приложения, но когда код выполняется, никого не волнует, насколько он велик, и это абсолютно не влияет на скорость.То есть, если вы не достигли своего предела памяти, а ОС начинает много менять местами, и все становится очень медленным.

Как уже упоминали другие, компилятор может оптимизировать ваш код.Но это также то, что вы можете сделать сами, используя #ifdefs для своих методов отладки, и обычно это рекомендуется делать.

2 голосов
/ 15 декабря 2010

Ваши методы генерируют код.Этот код будет где-то существовать.Когда ваш исполняемый файл собран, он, вероятно, будет существовать в вашем исполняемом файле.Это увеличит размер исполняемого файла, увеличит время его загрузки и может повлиять на поведение кеша.Поэтому ответ «да».

За исключением ... Это становится грязнее.

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

Итак, вкратцеответ «да» или «нет» в зависимости от множества факторов, которые вам придется исследовать, связанных с инструментами, которые вы используете, и платформой, на которой вы работаете.

0 голосов
/ 21 декабря 2010

Определение, является ли код неиспользованным или нет, является довольно сложной проблемой.Просто напишите программу hello world, статически свяжите ее с glibc и используйте objdump для просмотра всего мусора, который заканчивается в вашем двоичном файле.Подавляющее большинство этого кода не используется , но на него ссылаются таким образом, что компилятору или компоновщику трудно или невозможно оптимизировать его.Если вы не являетесь автором библиотеки, вы работаете очень усердно, чтобы избежать введения такого рода зависимости, неиспользуемые функции / методы будут тратить пространство и, вероятно, его много.Я подозреваю, что это еще сложнее в C ++, чем в C.

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