MSIL hat ldc.i8 Anweisung. Wie man Compiler macht, um das zu benutzen?
Sie nicht. Das wäre schlechter Code.
ldc.i4.s 20
conv.i8
ist drei Bytes Code: zwei für die Anweisungen und eine für die Konstante. Wobei
ldc.i8 20
ist neun Bytes: eins für die Anweisung und acht für die Konstante.
Der Compiler ist intelligent genug, um sechs unnötige Bytes zu vermeiden. Denken Sie daran, dass die Geschwindigkeit des Codes durch die Anzahl der Seitenfehler beeinträchtigt werden kann, die benötigt werden, um den Code in den Speicher zu laden. Generieren Code dreimal größer als es sein muss funktioniert gegen dieses Ziel.
Aber warten Sie, es gibt mehr, und es ist alles schlecht.
Je größer ein einfacher Codeblock ist, desto wahrscheinlicher ist es, dass ein Zweig um ihn herum länger ist als in das kompakte Verzweigungsbefehlsformat passt. Das bedeutet, dass diese De-Optimierung Verzweigungsbefehle groß machen kann, was wiederum die Basisblöcke größer macht, und jetzt vielleicht Zweige um sie sind nicht kompakt, und die ganze Sache kann Schneeball.
Es sind nicht nur die sechs zusätzlichen Bytes; es sind alle Konsequenzen dieser sechs zusätzlichen Bytes, die andere Code größer machen; Sie müssen diese Kosten auch berücksichtigen.
Der Compiler macht einen guten Job. Lass es seine Arbeit machen.
Wenn Sie einen Compiler verwenden, der schlechteren Code generiert, ist der Quellcode des Compilers verfügbar. Fühlen Sie sich frei, einen de-optimierenden Compiler zu schreiben, wenn Sie wirklich einen aus irgendeinem Grund brauchen.
Warum möchten Sie tun, was Compiler normalerweise verantwortlich ist? – Sinatr
Sie möchten also den Compiler zwingen, längeren Code als nötig zu generieren? – hvd
Sie möchten die MSIL * weniger * effizient machen, ldc.i8 benötigt 4 weitere Bytes. Kein Punkt dazu. –