У меня есть функция шаблона, которая может вызвать несколько версий перегруженной функции в зависимости от типа. Это выглядит примерно так: < /p>
template
void doSomething(T **inputT)
{
// do important things generalizable to types A and B
T *t = inputT[0];
doSomethingElse(t);
}
void doSomethingElse(A *input)
{
// do things specific to type A
free(input);
}
void doSomethingElse(B *input)
{
// do things specific to type B
free(input);
}
A **initializeSharedA()
{
A = malloc(sizeof(A*));
A[0] = malloc(sizeof(A));
}
static A **staticA = initializeSharedA();
int main()
{
doSomething(staticA);
}
< /code>
Игнорируйте тот факт, что вызовы «бесплатный (вход)» должны быть в Dosomphation или быть заменены на более C ++-решение стиля, двойное бесплатное, что это вызывает,-это то, что вызывает мою ошибку. /p>
Когда я составляю свой код в GCC с -O0, все работает нормально и, как и ожидалось. Однако перемещение даже к -og приводит к очень странному поведению. Я прошел через него в GDB, и происходило, так это то, что в рамках одной функции вызововать что -то (a), DosomethingElseelse (a*) и DosomethingElseElse (b*) оба были вызваны один за другим, что привело к двойной свободной ошибке в ошибке в Второй звонок. />#0 doSomethingElse at main.cpp:11
#1 in doSomething
#2 in main
< /code>
Затем, когда я перехожу к концу dosomethingetheneelse (a*), он немедленно входит в DosomethingElseElse (b*), и я получаю этот стек трассировку: < /p>
#0 doSomethingElse at main.cpp:17
#1 in ?? ()
#2 in doSomething
#3 in main
< /code>
Так что он до сих пор знает, что мы находимся в досоме , но потом есть загадочный »??» Кадр, который каким -то образом называет dosomethingelse (b*). < /p>
Я получаю окончательный подсказку при печати переменной t* t в Dosomething: < /p>
print t
$1 =
< /code>
Таким образом, мне кажется, что оптимизация удаляет переменную, чей тип определяет, какая функция Freemomehate Chhite вызывается, каким -то образом вызывает множество версий функции вызову вместо того, чтобы просто давать ошибку. Еще один интересный бит заключается в том, что при составлении с -og я не могу поместить точку останова на вызове DosomethingElse, так что я думаю, что это тоже стало вставлено. < /P>
Прямо сейчас я Работа по этому поводу, окружая что -то досовое и все версии dosomethingelse с: < /p>
#pragma GCC push_options
#pragma GCC optimize ("O0")
...
#pragma GCC pop_options
< /code>
Это работает и не слишком сильно замедляет программное обеспечение, но если мне придется отключить свой код, чтобы оно работало, что, вероятно, означает, что я просто придерживаюсь повязки на неопределенную поведение. Что я делаю неправильно, чтобы вызвать проблему в первую очередь?
Моя версия GCC - 11.5.0.
Подробнее здесь: https://stackoverflow.com/questions/794 ... overloaded
Оптимизация удаления переменной шаблона, тип которого определяет, какая перегруженная функция вызывается, что приводит к ⇐ C++
Программы на C++. Форум разработчиков
1740186557
Anonymous
У меня есть функция шаблона, которая может вызвать несколько версий перегруженной функции в зависимости от типа. Это выглядит примерно так: < /p>
template
void doSomething(T **inputT)
{
// do important things generalizable to types A and B
T *t = inputT[0];
doSomethingElse(t);
}
void doSomethingElse(A *input)
{
// do things specific to type A
free(input);
}
void doSomethingElse(B *input)
{
// do things specific to type B
free(input);
}
A **initializeSharedA()
{
A = malloc(sizeof(A*));
A[0] = malloc(sizeof(A));
}
static A **staticA = initializeSharedA();
int main()
{
doSomething(staticA);
}
< /code>
Игнорируйте тот факт, что вызовы «бесплатный (вход)» должны быть в Dosomphation или быть заменены на более C ++-решение стиля, двойное бесплатное, что это вызывает,-это то, что вызывает мою ошибку. /p>
Когда я составляю свой код в GCC с -O0, все работает нормально и, как и ожидалось. Однако перемещение даже к -og приводит к очень странному поведению. Я прошел через него в GDB, и происходило, так это то, что в рамках одной функции вызововать что -то (a), DosomethingElseelse (a*) и DosomethingElseElse (b*) оба были вызваны один за другим, что привело к двойной свободной ошибке в ошибке в Второй звонок. />#0 doSomethingElse at main.cpp:11
#1 in doSomething
#2 in main
< /code>
Затем, когда я перехожу к концу dosomethingetheneelse (a*), он немедленно входит в DosomethingElseElse (b*), и я получаю этот стек трассировку: < /p>
#0 doSomethingElse at main.cpp:17
#1 in ?? ()
#2 in doSomething
#3 in main
< /code>
Так что он до сих пор знает, что мы находимся в досоме , но потом есть загадочный »??» Кадр, который каким -то образом называет dosomethingelse (b*). < /p>
Я получаю окончательный подсказку при печати переменной t* t в Dosomething: < /p>
print t
$1 =
< /code>
Таким образом, мне кажется, что оптимизация удаляет переменную, чей тип определяет, какая функция Freemomehate Chhite вызывается, каким -то образом вызывает множество версий функции вызову вместо того, чтобы просто давать ошибку. Еще один интересный бит заключается в том, что при составлении с -og я не могу поместить точку останова на вызове DosomethingElse, так что я думаю, что это тоже стало вставлено. < /P>
Прямо сейчас я Работа по этому поводу, окружая что -то досовое и все версии dosomethingelse с: < /p>
#pragma GCC push_options
#pragma GCC optimize ("O0")
...
#pragma GCC pop_options
< /code>
Это работает и не слишком сильно замедляет программное обеспечение, но если мне придется отключить свой код, чтобы оно работало, что, вероятно, означает, что я просто придерживаюсь повязки на неопределенную поведение. Что я делаю неправильно, чтобы вызвать проблему в первую очередь?
Моя версия GCC - 11.5.0.
Подробнее здесь: [url]https://stackoverflow.com/questions/79458924/optimizations-removing-template-variable-whose-type-determines-which-overloaded[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия