Если функция определена в заголовочном файле (то есть тело функции находится в заголовочном файле), то компилятор может выбрать inline функцию в качестве оптимизации. Если функция определена в исходном файле, компилятор не может встроить ее. Кроме этого, на самом деле нет никакой разницы.
Однако есть люди, которые утверждают, что вы должны как можно больше поместить определения функций в исходный файл, чтобы люди, использующие файл заголовка, не увидели определение функции.
Вообще говоря, если у вас есть короткая функция, которая, по вашему мнению, имеет хорошие шансы быть встроенной, то было бы неплохо поместить ее в заголовочный файл, чтобы компилятор мог выполнить эту оптимизацию. В противном случае лучше всего поместить его в исходный файл, чтобы он не загромождал вещи. И в идеале заголовочный файл в любом случае показывает API, а не реализацию класса.
Что касается конструктора и деструктора синглтона, они будут вызываться только один раз во всей программе, так что вы ничего не получите, вставив их, так что вы могли бы также вставить их в исходный файл, если вы делаете много всего в них. Но если они пусты, зачем тратить место в исходном файле? Просто поместите их в заголовочный файл.