В туториалах по Вулкану (например на vulkan-tutorial.com) для C++ часто используются конструкции вида:
VkSuperPuperTrololo obj;
Эти композитные типы из Vulkan API являются сишными структурами, из-за чего по-умолчанию не инициализируются, соответственно все не заданные явно значения оказываются заполнены мусором.
Решение проблемы очевидно - curly braces:
VkSuperPuperTrololo obj{};
VkSuperPuperTrololo obj = VkSuperPuperTrololo();
Почему так никто не пишет? Или так пишут все, кроме авторов туториалов?
kkolyan
> Почему так никто не пишет?
А я вижу что пишут:
https://vulkan-tutorial.com/code/03_physical_device_selection.cpp
samrrr
ого, какие люди!
по теме - похоже пора поспать...
kkolyan
> Почему так никто не пишет?
Я так не пишу, потому что доступ к неинициализированной памяти valgrind ловит, а к зануленной — нет.
}:+()___ [Smile]
но ведь в данном случае доступ к этой памяти является ожидаемым - нули в этих структурах в Vulkan API во многих случаях являются валидными значениями.
или вы таким образом форсите практику заполнения всех полей явно?
kkolyan
> или вы таким образом форсите практику заполнения всех полей явно?
Для этого конкретного случая (заполнение интерфейсных структур вулкана) у меня нет четких предпочтений.
Зануление часто короче (т. е. лучше согласно KISS), но заполнение явно менее ошибкоопасно.
Однако в общем случае я за явный вариант.
}:+()___ [Smile]
спасибо за разъяснение.
kkolyan
> например на vulkan-tutorial.com
говнокод
kkolyan
> Почему так никто не пишет?
потому что те, кого интересует чистота кода, используют vulkan-hpp . единственная причина, почему может иметь смысл не использовать vulkan-hpp — это если ты пишешь на C, а не на C++.
Suslik
>потому что те, кого интересует чистота кода, используют vulkan-hpp
Не увидел там чистоты кода, а вот самопальные оберточки увидел, да.
> KhronosGroup
> входит в VulkanSDK
> самопальные оберточки
Suslik
Это впечатленка от кода, так-то спорить с профессиональностью поделия не буду.
Suslik
> те, кого интересует чистота кода, используют vulkan-hpp .
А слона то я и не заметил) Уже было думал что такие врапперы каждый на свой вкус пишет.
Suslik
> > например на vulkan-tutorial.com
> говнокод
А что именно там говнокодистого? Вопрос без подвоха - после всяких яв в крестах/сях многие вещи непривычны.
kkolyan
> А что именно там говнокодистого?
то, что этот туториал пытается объяснять, что делают GAPI вызовы, а не как писать программу с их использованием. поэтому весь vulkan-tutorial структурирован как ужасный моноблок с говнокодом, и у любого нормального программиста после его изучения должен остаться вопрос: "окей, а всё-таки, писать-то на этом как?". в нормальном коде вообще не должно быть методов с деинициализацией, потому что их написанием должен заниматься компилятор через RAII, а не кожаные мешки, которые постоянно косячат. инициализация структур в С-стиле подвержена ошибкам, так как в них можно записать всё что угодно (или не записать, например, в поле sType), когда C++ был специально придуман, чтобы от этих проблем избавляться. мне лично информацию из vulkan-tutorial'а было бы гораздо удобнее воспринять, если бы они прямо на этапе объяснения разбили сущности вулкана на независимые блоки — вот так ни из чего ищется физический девайс, вот так с использованием физического девайса создаётся логический, вот так для логического девайса создаётся свопчейн, итп. нет же, у них всё собрано в кучу и создаётся впечатление, что всё зависит от всего, хотя это вообще не так.
Suslik
значит мой детектор [не]прекрасного срабатывает правильно) спасибо за разъяснение.