Как исключить неиспользуемые методы из окончательного двоичного файла? - PullRequest
9 голосов
/ 09 августа 2011

Я думал, что private методы, которые не используются внутри его класса, удаляются компилятором / компоновщиком и не будут частью окончательного двоичного файла.

Я создал пример класса сзакрытый метод, который реализован, но не используется.

class XXX
{
  public:
  XXX();

  private:
  void MyUnusedMethod();
};

И в файле реализации:

void XXX::MyUnusedMethod()
{
  const char* hugo = "ABCCHARLYABC";
  printf( hugo );
}

После компиляции строка все еще существует в конечном двоичном файле.Зачем?И как я могу предотвратить это?

С уважением, Чарли

Ответы [ 4 ]

7 голосов
/ 09 августа 2011

Обычно это делается путем передачи параметров -ffunction-секции -fdata-секции в gcc. Посмотрите эту ссылку для более подробной информации.

7 голосов
/ 09 августа 2011

Одним из переносимых способов является создание файла .o для каждой функции.Затем создайте архив .a из этих файлов .o.При связывании с этим архивом компоновщик связывает только те файлы .o, которые разрешают символы, то есть файлы .o с функцией, которую никто не вызывает, не связаны.

Другой способ - использовать последние версии gcc с генерация кода времени ссылки .

3 голосов
/ 09 августа 2011

После компиляции строка все еще существует в конечном двоичном файле. Почему

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

Если вы не объявили все объекты этого типа XXX со статической связью , компилятор не может удалить тип (и, следовательно, метод) из сгенерированного объектного файла, поскольку какой-то другой объектный файл может получить доступ к значение с помощью extern. Компоновщик, который может видеть все объектные файлы одновременно, может решить эту проблему.

Однако, поскольку вы пометили свой вопрос как gcc, возможно, вы не компилируете и / или не связываетесь с -fvisibility = hidden . В этом случае даже компоновщик не может удалить символ (и, следовательно, код), потому что другие модули могут разрешить символ во время выполнения.

1 голос
/ 09 августа 2011

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

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