Я написал этот фрагмент кода, чтобы выяснить, будут ли компиляторы складывать идентичный код шаблона (в данном случае сортировка указателей).
Код: Выделить всё
#include
#include
#include
#define CAST 1
template
void f() {
std::size_t n = 1024;
T** v = (T**)std::malloc(n * sizeof(T*));
for(std::size_t i = 0; i < n; ++i) {
v[i] = (T*)std::malloc(sizeof(T));
*v[i] = T{};
}
#if CAST
std::sort((void**)v, (void**)(v + n));
#else
std::sort(v, v + n);
#endif
std::printf("%p, %p\n", v[0], v[n-1]);
for(std::size_t i = 0; i < n; ++i) {
v[i]->~T();
std::free(v[i]);
}
std::free(v);
}
int main() {
std::printf("CAST = %d\n", CAST);
f();
f();
f();
f();
f();
f();
f();
f();
}
CAST
G++ 12
Clang++ 15
false
22 КБ
35 КБ
истина
18 КБ
19 КБ
Это странно, потому что можно подумать, что если sort встроен, сгенерированный машинный код не должен зависеть от CAST. Но если он не встроен, то компилятор должен заметить, что несколько функций sort имеют одинаковый машинный код, и сложить их в один.
Но, видимо, это не так. случаться. Интересно, почему?
Подробнее здесь: https://stackoverflow.com/questions/791 ... inary-size