|
|
|
Поиск по массиву в compile time на С |
|
|
|
Aug 13 2018, 20:17
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(DASM @ Aug 13 2018, 23:08) Можно сделать его на пару миилиардов элементов, а при использовании поле его займет 4 байта. С const struct несколько не то. Надо ещё подумать С const struct все то же самое - вы явно создается один экземпляр, а чтобы сделать второй, то нужно дать этой структуре другое имя, но если не будете ее использовать, то любой современный компилятор вырежет ее из финальной прошивки за ненадобностью. Однако, если уж так сильно волнуетесь за буквально байты экономии FLASH памяти, то просто не засовывайте в const struct содержимое всей "война и мир", а оставляйте только то, что нужно в данном проекте. Чтобы уйти от соблазна "случайно" создать второй экземпляр этой структуры, то скрывайте ее область видимости по максимуму и забудьте уже про этот typedef )) Как вариант, объявить эту структуру const и тут же проинициализировать (как я привел в примере выше) прямо внутри одной функции, которая уже разбирая ее, будет вызывать другие функции, которые ничего не будут знать о вашей чудо-структуре.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 13 2018, 20:31
|
Гуру
Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48
|
Может ещё кому полезно будет: В анонимных структурах и union'ах для исключения лишнего уровня вложенности можно не писать название переменной структуры. Например как в примере с union выше достаточно написать Код struct DeviceInfo; и поля данной структуры будут на уровне самой структуры. Если конечно нет коллизий с другими переменными. Очень помогает в экономии ресурса клавиатуры
--------------------
Вам помочь или не мешать?
|
|
|
|
|
Aug 13 2018, 20:37
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Nixon @ Aug 13 2018, 23:31) Например как в примере с union выше достаточно написать Код struct DeviceInfo; и поля данной структуры будут на уровне самой структуры. Если конечно нет коллизий с другими переменными. В данном случае смысл как раз в том, чтобы deviceInfo нужно было явно указывать в коде, давая понять, с чем именно работаем. А если от этого сознательно отказаться, то по-моему очень сильно возрастает риск запутаться и в итоге залезть куда не нужно. Подобные "промашки" (сужу по своему опыту) всегда сопровождается одними из самых скверных багов А сам факт анонимности union действительно очень полезен, особенно, если union внутри своего уровня всего один. Код становится короче и не нужно думать, как ее назвать
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 13 2018, 20:51
|
Профессионал
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831
|
Цитата(Nixon @ Aug 13 2018, 23:49) Просто довольно полезная фишка. Особенно если есть множество структур в которые входит одинаковый блок (чисто протокольные штучки типа заголовка и т.д. ) . Многократно копировать этот блок глупо. Вводить лишний уровень вложенности тоже. Помогает подобное анонимное объявление. Заменяет собой лишний #define можно сказать. Согласен Цитата Особенно если есть множество структур в которые входит одинаковый блок Я это сделал несколько иначе (см. тот пример) - одинаковый блок вынес наружу (command), а все остальное разместил внутри анонимного union.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Aug 14 2018, 06:18
|
Гуру
Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493
|
Цитата(Nixon @ Aug 14 2018, 09:14) Не обязательно enum class : type. Достаточно enum : type. О, кстати такой вариант Код enum meE : char { E1, E2, EMAX };
int main() { meE e = E1; } Избавляет от необходимости писать meE e =meE::E1; Правда при этом тип такого enum имеет неявное преобразование в int но зато полностью решает мою проблему underlyng типа в VS как int и не приводит к необходимости модификации кода. Самый четкий и полезный ответ, собственно это на данный момент и было надо
|
|
|
|
|
Aug 14 2018, 06:24
|
Гуру
Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48
|
Цитата(DASM @ Aug 14 2018, 09:18) О, кстати такой вариант Код enum meE : char { E1, E2, EMAX };
int main() { meE e = E1; } Избавляет от необходимости писать meE e =meE::E1; Именно. Называется integral type unscoped enum. Но в программе с большим количеством enum'ов лучше все же enum class или enum в классе (второй менее жесткий по приведению типов, но такой же структуированный).
--------------------
Вам помочь или не мешать?
|
|
|
|
|
Aug 14 2018, 06:49
|
Знающий
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842
|
Цитата(DASM @ Aug 14 2018, 09:34) "3) Opaque enum declaration for an unscoped enumeration must specify the underlying type." Почему они так написали - понятно, пишут так что бы их поняли без буквоедства, но кмк тут они переборщили с обобщением. В стандарте следующее: Цитата For an enumeration whose underlying type is fixed, the values of the enumeration are the values of the underlying type. ... Two enumeration types are layout-compatible if they have the same underlying type. Как я это понимаю - если оно врет одинаково для всех энумов с одним типом - это ок. И оно может, т.к. гарантий что энум будет размещен именно в том типе что указан, нет, только то что значения энума помещаются в данный тип. Впрочем я на эту тему не хочу спорить. Даже если последний абзац - ошибочная интерпретация, есть различие между стандартом и реализациями в компиляторах. Повторюсь, когда я тестировал, сделать на наборе интересующие платформы <-> интересующие компиляторы типизируемые энумы работающим одинаково не получилось. Я этим занимался от байтоедства, толстый бутлоадер нужно было утрамбовать в размеры которые для него отведены и при этом сохранить общую кодовую базу с утилитами на компе. В целом даже примитивная сериализцаия лучше, чем прямые преобразования типов в байтовый поток и обратно. УПД Поправил цитату стандарта, скопировалось неправильно.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|