ProgrammatieC++ Embedded ontwikkelaar

Vertel hoe link-time en compile-time constantheid werkt in C++. Wat is het verschil tussen constexpr en const? Wanneer gebruik je welke?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In C++ bestaan er compile-time (constantheid tijdens compilatie) en link-time (tijdens koppelingsfase) constantheid.

  • Een const variabele is een object dat niet kan worden gewijzigd na initialisatie. Maar const garandeert niet altijd dat de waarde bekend is tijdens de compilatie; deze kan alleen tijdens runtime worden berekend.
  • constexpr garandeert dat de expressie of functie al tijdens de compilatie wordt berekend.

Voorbeeld:

const int x = time(0); // const, maar NIET constexpr: waarde wordt berekend tijdens runtime constexpr int y = 2 + 2; // constexpr: bekend tijdens compilatie constexpr int square(int x) { return x * x; } int arr[square(3)]; // grootte van de array — expressie van compile-tijd

Gebruik constexpr voor constante expressies die toegankelijk moeten zijn voor de compiler, bijvoorbeeld voor de groottes van een array of sjabloonparameters.

Misleidende vraag.

Kan een functie die als constexpr is gedeclareerd, worden aangeroepen met niet-constante argumenten?

Antwoord: Ja! Als de argumenten bekend zijn tijdens de compilatie, zal het resultaat worden berekend tijdens de compilatie. Als de argumenten alleen tijdens runtime bekend zijn, zal de functie worden berekend zoals een gewone.

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Wordt aangeroepen tijdens runtime

Voorbeelden van echte fouten door onbewustzijn van de nuances van het onderwerp.


Verhaal

Een van de modules stelde de grootte van een array in via const int, in de veronderstelling dat dit een constante van compile-tijd was. Op een andere compiler leidde dit tot een fout, omdat de waarde werd berekend tijdens runtime en de grootte van de array niet conforme was.


Verhaal

Bij het berekenen van hashes kon de compiler de berekeningen niet optimaliseren, omdat een const variabele werd gebruikt en niet constexpr. Resultaat: prestatievermindering van meer dan 2 keer in nieuwe releases.


Verhaal

Bij de migratie naar moderne standaarden werden de trefwoorden verwisseld en werd de functie als const verklaard in plaats van constexpr, waardoor het resultaat niet kon worden gebruikt in compile-time expressies van sjablonen. Snelle diagnostiek onthulde de fout, maar tijdens de beoordeling werd deze naar master doorgestuurd.