Вы не должны заглядывать внутрь, чтобы увидеть, как делают колбасы. : -)
Хорошо, теперь вы посмотрели. И вы видели, что Windows не является одной из тех платформ, чье сложное соглашение о вызовах требует выделения памяти в va_list
. Оказывается, вам не нужно использовать va_copy
вместо простого присваивания и что va_end
фактически ничего не делает. Это было плохо. Ты не должен был смотреть. Теперь ты должен все это забыть.
Потому что завтра все может измениться. Новая библиотека или обновление в логике оптимизации компилятора c, или кто знает что, и вдруг va_copy
требуется, va_end
предотвращает утечки памяти, и ваши виновные знания внезапно оказываются опасной ошибкой .
Стандарт гласит, что вы должны использовать va_copy
для копирования va_list
. Стандарт гласит, что вы должны позвонить va_end
за каждый инициализированный va_list
. И ты должен сделать это. Потому что вы не можете знать, что это не нужно на вашей платформе, не следя за тем, где вы не собираетесь заниматься бизнесом.
Стандартная библиотека не должна подчиняться этим правилам. Он может полностью знать свою платформу и свои собственные внутренние компоненты, поскольку ему нужно работать только в собственной среде. Если что-то изменится, хорошие люди, которые поддерживают стандартную библиотеку, узнают об этом, и они позаботятся о том, чтобы новая версия работала с новой версией их компилятора на их платформе
Так что дело в следующем: Реализация будет гарантировать, что если вы играете по правилам, все будет работать. Существуют правила, позволяющие разработчикам справляться с особенностями своей платформы, и чтобы компиляторы могли выжать как можно больше оптимизированных циклов.
Иногда кажется, что сокращение углов и нарушение правил не повредит По крайней мере, не здесь и не сейчас. Но не поддавайтесь этому искушению. Потому что если вы это сделаете, вы оставите в своем коде бомбу замедленного действия, которая рано или поздно go сработает.