Quantcast
Channel: Linux.org.ru: Форум
Viewing all articles
Browse latest Browse all 108395

type aliasing

$
0
0

Здравствуйте. Я тут недавно ковырялся с сокетами и столкнулся с такой ерундой: при передачи ipv4 сокета в байнд, необходимо выполнить преобразование из sockaddr_in* в sockaddr*

bind(sfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in))
Две структуры не родственники и одна другую в себя не включает. Учитывая Type aliasing, правильно ли я понимаю, что чисто теоретически это невалидный код?
Но ведь это не говнокод какой-то, на что рассчитывал тот, кто это писал? Предположу, что расчётат на размещение bind в отдельном модуле (не допустить инлайна), следовательно не оставить ничего в регистрах перед вызовом. Что думаете? Конечно, можно не париться так сильно, ведь в документации в bind такой каст производится.
А вот пример из stl (на cppreference подобная техника демонстрируется, правда для <char>):
wifstream f("file");
double val;
f.read((wchar_t*)&val, 1); 
Почти наверняка внутри шаблона вызовется какая-нибудь функция ос, но это шаблон, сам он спокойно зайнлайнится, а его собственная реализация не очевидна для конечного пользователя.
К чему вообще так жёстко связывать ограничениями без предоставления простых обходных путей, что даже для реализации базовых компонентов эти правила активно нарушаются.

 


Viewing all articles
Browse latest Browse all 108395

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>