Является ли пример 2 примером того, как лучше не делать в больших проектах?
Большинство компиляторов будут инлайнить функцию в этом случае.
Разница очень простая - в первом случае вы сможете вынести реализацию в отдельную единицу компиляции, а во втором - нет. Зачем это делать - читайте внимательно про compilation unit. Особенно, если вы пришли из языка, где такой задачи, как разделение include-файлов и файлов реализации нет в принципе.
Конечно, есть случаи когда вынести реализацию в отдельный cpp-шник невозможно. Стандартный пример - шаблонные классы. Для них реализации всех функций все равно придется указывать в файле, который будет инклудиться. Поэтому особой разницы между 1 и 2 в этом случае нет.
это как-то связано с компилятором и тем, как он выделяет под функцию память.
Тогда почитайте про inlining функций, это видимо то, что вы слышали.