Я знаю, что этот вопрос (или связанный с ним) уже был задан в различных сообщениях на этом форуме (и я прочитал их все), но я до сих пор не получаю то, что здесь происходит с компилятором IAR 9.50.
Рассмотрим две следующие структуры: < /p>
struct ParamsStruct
{
uint8_t a;
uint16_t b;
uint32_t c;
};
struct ParamsDef
{
char acronym[5];
ValueType type;
uint32_t offset;
int min;
int max;
};
< /code>
и следующая таблица параметров: < /p>
extern const ParamsDef MY_PARAMETERS_TABLE[];
< /code>
Если я определяю свою таблицу, как это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, offsetof(ParamsStruct,a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
Все работает нормально, и таблица фактически размещена линкером во Flash, что именно то, что я ищу. Обратите внимание, что таблица не является contexpr, но линкер достаточно умный в этой ситуации, чтобы в любом случае поместить ее во Flash. Это означает, что OffSetF () может быть разрешено во время компиляции. Теперь, в тот момент, когда я делаю это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, member_offset(&ParamsStruct::a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
с meman_offset определяется как таковой: < /p>
template
size_t member_offset(U T::* member)
{
return reinterpret_cast(
&(reinterpret_cast(NULL)->*member)
);
};
< /code>
или как таковое: < /p>
template
inline size_t constexpr member_offset(T1 T2::* member) {
constexpr T2 object{};
return size_t(&(object.*member)) - size_t(&object);
}
< /code>
Таблица фактически помещается в оперативную память, то есть она будет построена во время выполнения.
Что я не получаю, так это то, как макроффильмы Offsetof () можно считать contexpr, когда он нарушает ограничение inertrepret_cast выражения ContexPR, поскольку он определяется как таковой: < /p>
#define offsetof(s,m) ((::size_t)&reinterpret_cast((((s*)0)->m)))
< /code>
Я не получаю то, что делает OffsetOf () разрешенным во время компиляции, а не meman_offset ()? К сожалению, также кажется, что просто нет способа сделать meman_offset () contexpr…
Любое просвещение более чем приветствуется!
Подробнее здесь: https://stackoverflow.com/questions/796 ... ber-offset
Contexpr offsetof () и meman_offset () ⇐ C++
Программы на C++. Форум разработчиков
1750332118
Anonymous
Я знаю, что этот вопрос (или связанный с ним) уже был задан в различных сообщениях на этом форуме (и я прочитал их все), но я до сих пор не получаю то, что здесь происходит с компилятором IAR 9.50.
Рассмотрим две следующие структуры: < /p>
struct ParamsStruct
{
uint8_t a;
uint16_t b;
uint32_t c;
};
struct ParamsDef
{
char acronym[5];
ValueType type;
uint32_t offset;
int min;
int max;
};
< /code>
и следующая таблица параметров: < /p>
extern const ParamsDef MY_PARAMETERS_TABLE[];
< /code>
Если я определяю свою таблицу, как это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, offsetof(ParamsStruct,a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
Все работает нормально, и таблица фактически размещена линкером во Flash, что именно то, что я ищу. Обратите внимание, что таблица не является contexpr, но линкер достаточно умный в этой ситуации, чтобы в любом случае поместить ее во Flash. Это означает, что OffSetF () может быть разрешено во время компиляции. Теперь, в тот момент, когда я делаю это: < /p>
const ParamsDef MY_PARAMETERS_TABLE[] =
{
{"lala",ValueType::UINT8, member_offset(&ParamsStruct::a), 0, 10},
{"lolo",ValueType::UINT16, offsetof(ParamsStruct,b), 0, 50},
{"loli",ValueType::UINT32, offsetof(ParamsStruct,c), 0, 200},
};
< /code>
с meman_offset определяется как таковой: < /p>
template
size_t member_offset(U T::* member)
{
return reinterpret_cast(
&(reinterpret_cast(NULL)->*member)
);
};
< /code>
или как таковое: < /p>
template
inline size_t constexpr member_offset(T1 T2::* member) {
constexpr T2 object{};
return size_t(&(object.*member)) - size_t(&object);
}
< /code>
Таблица фактически помещается в оперативную память, то есть она будет построена во время выполнения.
Что я не получаю, так это то, как макроффильмы Offsetof () можно считать contexpr, когда он нарушает ограничение inertrepret_cast выражения ContexPR, поскольку он определяется как таковой: < /p>
#define offsetof(s,m) ((::size_t)&reinterpret_cast((((s*)0)->m)))
< /code>
Я не получаю то, что делает OffsetOf () разрешенным во время компиляции, а не meman_offset ()? К сожалению, также кажется, что просто нет способа сделать meman_offset () contexpr…
Любое просвещение более чем приветствуется!
Подробнее здесь: [url]https://stackoverflow.com/questions/79671985/constexpr-offsetof-and-member-offset[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия