Почему приведение указателей к `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) {
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();
}
Я компилирую его с помощью -O3, а затем удаляю двоичный файл. Интересно, что сгенерированный двоичный размер зависит от того, приводятся ли указатели к void* перед сортировкой. Особенно для Clang++ двоичный файл намного меньше.



CAST
G++ 12
Clang++ 15




false
22 КБ
35 КБ


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



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

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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