Klopt. Daarom schrijf ik ook dat direct hardware aansturen met hogere talen niet mogelijk is.
Wat is er niet 'direct' aan het gebruik van memory mapped I/O?
Het is trouwens wel mogelijk (uiteindelijk is alles machinecode), alleen doet niemand het omdat het weinig zin heeft en de moeite groter is dan hetgeen je ervoor kan terugkrijgen.
Laten we het houden op dat het een semantische discussie is.
Zie trouwens:
https://en.wikipedia.org/...ty_%28operating_system%29Wat een onzin. Je kunt ook hele andere optimalisaties doen die het gebruik van het geheugen potentieel veel minder efficient maken.
Weet ik ook wel, maar jij haalde in je betoog aan dat het over snellere code ging.
Niet over code die minder geheugen gebruikte of bepaalde instructies nodig had, etc.
Ik zeg enkel dat performance optimisations over het algemeen op hetzelfde neerkomen: cache hierarchy. Zelfs SIMD is in hogere talen geen probleem meer.
Zie
https://blogs.msdn.com/b/...-are-getting-married.aspx
Even overlopen:
-- Optimalisatie naar minimale hoeveelheid instructies voor de processor.
-- Optimalisatie naar een zo klein mogelijke gecompileerde machinecode (heel erg van belang bij embedded systemen).
Compiler switch. Typisch zinloos op hogere talen. Je binary 100KB kleinere maken en dan de run-time libraries van enkele MB inladen

... In de Linux kernel wordt -Os trouwens nauwelijks gebruikt omdat het meestal idiote code genereert.
Zie
https://lwn.net/Articles/534735/-- Optimalisatie naar een bepaalde soort instructies (instructies die bijvoorbeeld een specifieke processor sneller kan afhandelen).
Beschikbaar op higher level en lower level talen. Zie link van hierboven.
-- Optimalisatie naar energie-zuinige processors of specifiek energie-zuinige instructies voor een processor (denk aan kleine batterij gevoede systemen).
Zaken zoals ARM Thumb instructies zijn ook gewoon een compiler switch.
-- Optimalisatie naar geheugen snelheid door bewust bepaalde zaken juist wel of niet in geheugen te laden (zaken die een hogere taal misschien niet automatisch direct in geheugen zet bijvoorbeeld).
Ik denk dat je bedoelt op prefetch instructies? Deze zijn echt je weapon of last resort. Ze zijn zeer delicaat en je past ze best enkel toe al je alle andere memory-bound optimalisaties al gehad hebt. (met uitzondering van cache evict en cacheline clear). Zulke code kan bij de minste aanpassing (of zelfs compiler update) averechts uitpakken en je code trager maken.
Hogere talen hebben hier zelfs een voordeel, ze kunnen in de JIT compiler dit soort dependencies beter detecteren. Of ze echter prefetches genereren kon ik niet meteen vinden.
-- Optimalisatie van geheugen snelheid door te spelen met snel stack (CPU cache) geheugen of relatief langzaam heap geheugen allocatie (bijvoorbeeld RAM geheugen).
Ik denk dat je hier wel weet wat er achter zit (stack geheugen is door het continu gebruik meestal aanwezig in de caches en genereert dus minder cache misses), terwijl een nieuwe allocatie cache-cold kan zijn - alleen druk je jezelf nogal dubbelzinnig uit... Natuurlijk is een heap allocatie zelf ook niet gratis aangezien de meeste standaard allocators locks hebben en een hoop boekhouding moeten doen (en daarbij zelf ook nog eens extra cache misses genereren).
Ja duh, dat is mijn hele punt juist: dat moet je dan wel weten/op letten/goed doen. En dat kost natuurlijk moeite. En is dus lastiger. Je kunt ook prima heel snel bug-free direct machine-code schrijven als je maar goed op let en als je maar super-man bent die machine-code snapt.

Weet ik wel, maar mijn punt was dat in huidige tijden de tools van bijvoorbeeld C++ goed genoeg zijn om dit soort fouten tot een minimum te houden.
Je zou zelfs kunnen zeggen dat Boost hier een klein mirakel heeft verricht.
Een memory leak waarbij je geheugen vult dat je gereserveerd hebt (het voorbeeld dat je noemt) is niet echt een problematische memory leak, meer een ordinaire bug.
En hoe is een memory leak geen ordinaire bug dan?
Een echte memory-leak die je in C bijvoorbeeld kunt maken (die je helemaal niet in hogere talen kunt maken) is er eentje waarbij je, al dan niet per ongeluk geheugen adresseert buiten hetgeen je in je programma gereserveerd hebt voor adressering.
Nee dat is een invalid reference (of in sommige gevallen een stale pointer access).
Dit is een memory leak:
[code]
void leak(void) {
int* leaking = malloc(400);
}
[/code]
Het geheugen waar leaking naar wees is op geen enkele (normale) manier nog te bereiken nadat de leak() functie afgelopen is.
Maar dat wist je (hopelijk) zelf ook wel.
In Managed talen kan je ook memory leaks hebben, zie:
https://msdn.microsoft.com/en-us/magazine/cc163491.aspx
Deze zijn soms even moeilijk te vinden als in een C/C++ applicatie.