C++'s atomic::read_and_increment_one() (name may be wrong) is a single CPU instruction. Similarly the logic operations and other pointer operations have direct assembly equivalents.
This direct translatability allows a lot of the things we do at the low level. All the abstractions added by JS, python and other languages incur great performance penalties that we don't notice at application level.
However, some functions are called a couple of million times per second, and you don't notice that, or your CPU runs them pretty effectively with no discernible load.
Embedded is something entirely different, where you have 10x-50x less resources and insane time constraints to do things at real time. There are even standards to further limit C programming to several guidelines/patterns/ways to make sure the code is deterministic, down to the CPU cycle counts (since boot-up) in some cases.
For some personal opinion, I don't consider C & C++ complex languages. They're easy. They just needs the programmer to know what he/she's doing. Otherwise it just goes bang, and it's a good thing in most cases.