Каждое соединение TCP требует начального квитирования, прежде чем данные будут переданы. Кроме того, заголовок TCP содержит много издержек, предназначенных для различных сигналов и обнаружения доставки сообщений. Для обмена сообщениями будет, вероятно, достаточен UDP, приемлем ли маленький шанс отказа. Если получение должно быть проверено, TCP является Вашим наилучшим вариантом.
Поскольку компилятор не может самостоятельно решить, когда добавлять определение NDEBUG, а когда нет, флаг всегда устанавливается либо в make-файле, либо в файле проекта (в зависимости от вашей системы сборки) .
На этот вопрос действительно сложно ответить, так как вы не указали систему сборки, которую используете. Если вы используете autoconf, то либо ожидается, что пользователь поместит -DNDEBUG в CPPFLAGS вручную (или, возможно, вы установили его из файла CONFIG_SITE, который был изменен), либо configure.ac может установить пользовательскую переменную для настройки NDEBUG , или configure.ac может вызывать AC_HEADER_ASSERT, и в этом случае добавление --disable-assert к вызову configure определит NDEBUG в config.h. Это может произойти разными способами.
По моему опыту, -DNDEBUG был передан вручную, то есть make-файлы были написаны таким образом, что флаг передается при сборке в режиме выпуска.