Thumbnail Modernere C++ features

Door: Thijs Zumbrink
04-06-2015 10:20

Ik ben weer verder gegaan met de development van TaZCrash, en nu ik wijzer ben dan voorheen, ben ik tot het inzicht gekomen om al dat low-level gedoe maar achterwege te laten tot er optimalisatie nodig is. (Aangetoond door profiling!)

Met dat besef komt een groter gebruik van STL containers in plaats van low level arrays, en dergelijke behulpzame features.

Hieronder een overzicht van C++11 features die mij zover al geholpen hebben. Er gaan nog velen volgen (prime candidates zijn de smart pointer en lambda functions) maar die komen later.

std::chrono

Ongelooflijk handige library om timing te regelen. Voorheen: een eigen TimeCounter class die eerst aan het systeem probeert te kijken hoe precies de klok is, de lengte van een tick vaststelt, en vervolgens in seconden of ticks (met de nodige conversies) sleep acties kan uitvoeren. Hevig afhankelijk van het OS. Nu: simpelweg sleeps en dergelijke via std::chrono doen, welke zich op elk OS hetzelfde gedraagt. De TimeCounter class is niet meer nodig.

std::thread

Eindelijk threading in de STL! Voorheen: vastzitten aan Boost libraries die op elk OS en met elke versie leiden tot andere compilatieproblemen. Nu: eenduidige interface voor zo'n elementaire functionaliteit. Van een dependency af zijn waardoor het project simpeler is.

Range-based for loops

Ook een ongelooflijke verbetering! Het is geen geheim dat de STL voor gruwelijk lelijke syntax kan zorgen, maar range-based for loops maken een hoop goed.

Voorheen:
for (std::vector<GameListener*>::iterator i = gameListeners.begin(); i != gameListeners.end(); ++i) {
(*i)->onGameStarted();
}

Nu:
for (GameListener* i : gameListeners) {
i->onGameStarted();
}


Enum class

Ook leuk: type-safety met enums. Voorheen: de compiler vindt het prima dat je enums als integers gebruikt, en enige vorm van statische analyse mist. Nu: je compiler en IDE helpen je op een manier die logisch is. Je misbruikt geen waarden voor andere doeleinden meer. Het enige jammere is dat je niet meer zomaar een bit vector kan maken met binary operators.

nullptr

Een logische waarde die je ook wel semantisch wilt vastleggen is "null pointer". Voorheen: eindeloos #define NULL 0 in je bestanden zetten. Static analysis vindt het niet erg dat je integer en pointers door elkaar gebruikt. Nu: een language construct gebruiken die niet op een preprocessor fabricatie berust.

Reacties
Log in of registreer om reacties te plaatsen.