Здравствуйте, Qbit86, Вы писали:
V>>Ну, в несколько раз конечный образ обычно уменьшается.
Q>Ну смотри. Я компилировал указанные выше четыре исходника в MSVS 2015 в статическую библиотеку.
Считай, что статическая библиотека при включенной опции "link time code generation" — это просто некий байт-код. ))
Q>Что упущено; из-за чего эффект от оптимизации распухания кода незаметен?
Упущена стадия релизной кодогенерации конечного бинарного образа.
Вот простой пример:
#include <vector>
int main()
{
std::vector<int> ints;
std::vector<float> floats;
ints.push_back(1);
floats.push_back(1);
return 0;
}
Вот его дисассемблинг в отладчике в релизе:
ints.push_back(1);
0014104D lea ecx,[ints]
00141050 mov byte ptr [ebp-4],1
00141054 call std::vector<float,std::allocator<float> >::_Reserve (0141140h)
...
floats.push_back(1);
014106A lea ecx,[floats]
0014106D mov dword ptr [ebp-20h],eax
00141070 call std::vector<float,std::allocator<float> >::_Reserve (0141140h)
А вот освобождение памяти обоих контейнеров перед выходом из scope:
return 0;
00141083 lea ecx,[floats]
00141089 call std::vector<int,std::allocator<int> >::_Tidy (01410C0h)
0014108E lea ecx,[ints]
00141091 call std::vector<int,std::allocator<int> >::_Tidy (01410C0h)