Войти
ПрограммированиеФорумОбщее

[РЕШЕНО] Инициализация C-структур из C++ best practice

#0
(Правка: 3:58) 3:39, 22 фев. 2021

В туториалах по Вулкану (например на vulkan-tutorial.com) для C++ часто используются конструкции вида:

VkSuperPuperTrololo obj;

Эти композитные типы из Vulkan API являются сишными структурами, из-за чего по-умолчанию не инициализируются, соответственно все не заданные явно значения оказываются заполнены мусором.

Решение проблемы очевидно - curly braces:

VkSuperPuperTrololo obj{};
или на крайняк:
VkSuperPuperTrololo obj = VkSuperPuperTrololo();

Почему так никто не пишет? Или так пишут все, кроме авторов туториалов?

#1
5:13, 22 фев. 2021

kkolyan
> Почему так никто не пишет?
А я вижу что пишут:
https://vulkan-tutorial.com/code/03_physical_device_selection.cpp

#2
(Правка: 5:18) 5:17, 22 фев. 2021

samrrr
ого, какие люди!

по теме - похоже пора поспать...

#3
11:37, 22 фев. 2021

kkolyan
> Почему так никто не пишет?
Я так не пишу, потому что доступ к неинициализированной памяти valgrind ловит, а к зануленной — нет.

#4
15:42, 22 фев. 2021

}:+()___ [Smile]
но ведь в данном случае доступ к этой памяти является ожидаемым - нули в этих структурах в Vulkan API во многих случаях являются валидными значениями.

или вы таким образом форсите практику заполнения всех полей явно?

#5
(Правка: 15:57) 15:55, 22 фев. 2021

kkolyan
> или вы таким образом форсите практику заполнения всех полей явно?
Для этого конкретного случая (заполнение интерфейсных структур вулкана) у меня нет четких предпочтений.
Зануление часто короче (т. е. лучше согласно KISS), но заполнение явно менее ошибкоопасно.
Однако в общем случае я за явный вариант.

#6
0:47, 23 фев. 2021

}:+()___ [Smile]
спасибо за разъяснение.

#7
(Правка: 6:31) 6:28, 23 фев. 2021

kkolyan
> например на vulkan-tutorial.com
говнокод

kkolyan
> Почему так никто не пишет?
потому что те, кого интересует чистота кода, используют vulkan-hpp . единственная причина, почему может иметь смысл не использовать vulkan-hpp — это если ты пишешь на C, а не на C++.

#8
8:05, 23 фев. 2021

Suslik
>потому что те, кого интересует чистота кода, используют vulkan-hpp
Не увидел там чистоты кода, а вот самопальные оберточки увидел, да.

#9
8:13, 23 фев. 2021

> KhronosGroup
> входит в VulkanSDK
> самопальные оберточки

#10
8:19, 23 фев. 2021

Suslik
Это впечатленка от кода, так-то спорить с профессиональностью поделия не буду.

#11
17:33, 23 фев. 2021

Suslik
> те, кого интересует чистота кода, используют vulkan-hpp .
А слона то я и не заметил) Уже было думал что такие врапперы каждый на свой вкус пишет.

Suslik
> > например на vulkan-tutorial.com
> говнокод
А что именно там говнокодистого? Вопрос без подвоха - после всяких яв в крестах/сях многие вещи непривычны.

#12
(Правка: 17:49) 17:48, 23 фев. 2021

kkolyan
> А что именно там говнокодистого?
то, что этот туториал пытается объяснять, что делают GAPI вызовы, а не как писать программу с их использованием. поэтому весь vulkan-tutorial структурирован как ужасный моноблок с говнокодом, и у любого нормального программиста после его изучения должен остаться вопрос: "окей, а всё-таки, писать-то на этом как?". в нормальном коде вообще не должно быть методов с деинициализацией, потому что их написанием должен заниматься компилятор через RAII, а не кожаные мешки, которые постоянно косячат. инициализация структур в С-стиле подвержена ошибкам, так как в них можно записать всё что угодно (или не записать, например, в поле sType), когда C++ был специально придуман, чтобы от этих проблем избавляться. мне лично информацию из vulkan-tutorial'а было бы гораздо удобнее воспринять, если бы они прямо на этапе объяснения разбили сущности вулкана на независимые блоки — вот так ни из чего ищется физический девайс, вот так с использованием физического девайса создаётся логический, вот так для логического девайса создаётся свопчейн, итп. нет же, у них всё собрано в кучу и создаётся впечатление, что всё зависит от всего, хотя это вообще не так.

#13
0:23, 26 фев. 2021

Suslik
значит мой детектор [не]прекрасного срабатывает правильно) спасибо за разъяснение.

ПрограммированиеФорумОбщее