Почему приведение указателей к `void*` уменьшает размер двоичного файла? ⇐ C++

Программы на C++. Форум разработчиков
Anonymous
Почему приведение указателей к `void*` уменьшает размер двоичного файла?

Сообщение Anonymous »

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

Код: Выделить всё

#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) {
std::free(v[i]);
}

std::free(v);
}

int main() {
std::printf("CAST = %d\n", CAST);
f();
f();
f();
f();
f();
f();
f();
f();
}
Я компилирую его с помощью -O3, а затем удаляю двоичный файл. Интересно, что сгенерированный двоичный размер зависит от того, приводятся ли указатели к void* перед сортировкой. Особенно для Clang++ двоичный файл намного меньше.



CAST
G++ 12
Clang++ 15




false
22 КБ
35 КБ


истина
18 КБ
19 КБ



Это странно, потому что можно подумать, что если sort встроен, сгенерированный машинный код не должен зависеть от CAST. Но если он не встроен, то компилятор должен заметить, что несколько функций sort имеют одинаковый машинный код, и сложить их в один.
Но, видимо, это не так. случаться. Интересно, почему?

Подробнее здесь: https://stackoverflow.com/questions/791 ... inary-size

Вернуться в «C++»