Я работаю над проектом с чрезвычайно низкой единицей тестирования. У нас почти нулевое модульное тестирование, и каждый API статичен.Является ли C++ компоновщик умным о виртуальных методах, используемых только из одного класса в программе?
Чтобы иметь возможность модульного тестирования некоторые из моего кода я создаю оберток как
class ApiWrapper {
virtual int Call(foo, bar) {
return ApiCall(foo, bar);
}
};
Сейчас в моих функций вместо:
int myfunc() {
APiCall(foo, bar);
}
я:
int myfunc(ApiWrapper* wrapper) {
wrapper->Call(foo, bar);
}
Этот путь Я могу издеваться над такой функциональностью. Проблема в том, что некоторые коллеги жалуются на то, что производственный код не должен быть затронут из-за возможностей проверки - нонсенс, который я знаю, но реальность.
В любом случае, я считаю, что где-то я где-то читал, что компиляторы действительно умны в замене неиспользуемого полиморфного поведения на прямой вызов ... или если нет класса, который переопределяет виртуальный метод, он становится «нормальным».
Я экспериментировал, и на gcc 4.8 он не встроен или не вызывает виртуальный метод, а создает vt.
Я попытался Google, но я ничего не нашел об этом. Является ли это чем-то, или я забываю ... или я должен что-то сделать, чтобы объяснить это компоновщику, флаг оптимизации или что-то еще?
Обратите внимание, что в процессе производства этот класс является окончательным, в тестовой среде это не так. Это именно то, что должен уметь компоновщик и обнаружить.
Я хочу, чтобы вы это искали: http://stackoverflow.com/questions/733737/are-inline-virtual-functions-really-a-non-sense – NathanOliver
Мне непонятно, зачем нужны обертки , –
, чтобы иметь возможность издеваться над функциональностью, когда я проверяю свой код, который зависит от него – gsf