Зависит ли размер исполняемой программы от количества подключенных заголовочных файлов?
Вопрос следующий: "Зависит ли размер исполняемой программы от количества подключенных заголовочных файлов?". Если например есть код: 1)
#include <stdio.h>
int main(void)
{
printf("Hello, StackOverflov!\n");
return 0;
}
и код:
2)
int printf(const char *restrict format, ...); // Just a prototype
int main(void)
{
printf("Hello, StackOverflov!\n");
return 0;
}
Это как пример. Могут подключаться большие хедеры, такие как Windows.h и тогда разница может иметь значение.
3) Еще как вариант написана руками функция, определение которой мы подключаем.
Есть ли разница в быстродействии и размере?
+бонус есть ли разница в вызове: printf("Hello, World!"); и последовательно (не обязательно 2 вызова (это как пример, могут быть большие функции, когда размер будет иметь значение)) printf("Hello, ") printf("world!");
Компилятор объединит эти 2 вызова в один?
Спасибо. Знаю, что компьютеры сейчас мощные и разница может не заметна, но все же есть ли здесь эффективнее варианты или компиляторы стали слишком умны?
Ответы (1 шт):
Будет ли включение заголовочного файла влиять на размер конечного кода или нет зависит от содержимого этого заголовочного файла. Если он не содержит ничего, что могло бы повлиять на размер кода, то не будет никакой зависимости от того, сколько раз вы включите этот заголовочный файл в своей программе. Но никто не заставляет писать в заголовочных файлах только объявления. Вы можете вообще весь код написать в заголовочных файлах, а затем с помощью include "прицепить" их к единицам трансляции.
Рассмотрим пример с массивом в заголовочном файле.
//header.h
//Массив на 512 Мб
static char volatile unique_buffer[1024ull * 1024ull * 512ull] = {1, unique_buffer[sizeof(unique_buffer) - 1] = 22};
//1.cpp
#include "header.h"
int main() {}
//2.cpp
#include "header.h"
Соберем gcc: g++ -o main.exe -Os -s -DNDEBUG 1.cpp 2.cpp
И получаем выполняемый файл размером в ~1Гб, т.е. в каждую единицу трансляции, куда включался header.h попала своя копия массива размером в 512 Мб. Так что на ваш вопрос нельзя дать однозначного ответа.
