Ich habe eine Vorlagenfunktion, mit der je nach Typ mehrere Versionen einer überlasteten Funktion aufrufen kann. Es sieht ungefähr so aus: < /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>
Ignorieren Sie die Tatsache, dass die Aufrufe "frei (input)" in Dosen sein sollten oder durch eine mehr C ++-Stillösung ersetzt werden, die doppelte freie, die es verursacht. /p>
Wenn ich meinen Code in GCC mit -O0 kompiliere, funktioniert alles gut und erwartungsgemäß. Wenn Sie jedoch auch nur zu -OG nach oben gehen, führt dies zu einem sehr seltsamen Verhalten. Ich trat in GDB durch, und was geschah, ist, dass innerhalb der einzelnen Funktionsaufrufdosen (a) Dosennutze (A*) und Dosierung (B*) beide nacheinander gerufen wurden, was zu einem doppelten freien Fehler in der führte Zweiter Anruf.
So sieht die Stapelspur aus />#0 doSomethingElse at main.cpp:11
#1 in doSomething
#2 in main
< /code>
Wenn ich dann bis zum Ende der Dosenstufe (a*) durchstehe, tritt sofort Dosenstich (B*) ein und ich bekomme diese Stapelspur: < /p>
#0 doSomethingElse at main.cpp:17
#1 in ?? ()
#2 in doSomething
#3 in main
< /code>
Also weiß es immer noch, dass wir in Dosen sind , aber dann gibt es ein mysteriöses "??" Rahmen, der irgendwie Dosenging (B*) nennt (b*).print t
$1 =
< /code>
so scheint es mir, dass Optimierungen die Variable entfernen, deren Typ bestimmt, welche Freesoming -Funktion aufgerufen wird, und irgendwie dazu führt, dass mehrere Versionen der Funktion aufgerufen werden, anstatt nur einen Fehler zu geben. Ein weiteres interessantes Stück ist, dass ich, wenn ich mit -OG zusammengestellt bin Arbeiten Sie um das Umgebungsdosen und alle Versionen von Dosen mit: < /p>
#pragma GCC push_options
#pragma GCC optimize ("O0")
...
#pragma GCC pop_options
< /code>
Dies funktioniert und verlangsamt die Software nicht zu sehr Verhalten. Was mache ich falsch, um das Problem überhaupt zu verursachen?
Meine Version von GCC ist 11.5.0.>
Optimierungen Entfernen der Vorlagenvariablen, deren Typ bestimmt, welche überlastete Funktion aufgerufen wird, was zu m ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post
-
-
Ausführungsreihenfolge in der asynchronen Funktion. Wie wird es bestimmt?
by Anonymous » » in Python - 0 Replies
- 4 Views
-
Last post by Anonymous
-