2 int8 in ein int16 reinkopieren?

Gast #2522334
Wenn Du mehr tust, als die Behauptung

>Das muss doch auch effizienter gehen...

in den Raum zu stellen, könnte man ja mal darüber nachdenken.

Ansonsten würde ich Dir das umgekehrte Verfahren empfehlen.
Implementiere es, schau Dir den Assemblercode an
und denk nochmal d'rüber nach.
Persönliche Seite #2522767
Bei der Union ist das Ergebnis nicht portabel, ist also mithin von 
verwendeter Plattform und Compiler abhängig (ein avr-gcc ist was anderes 
als ein arm-gcc).

Auch denn in einem speziellen Fall eine Union ein paar Instruktionen 
sparen sollte, ist die portable und lesbare Variante vorzuziehen.

Den Code mit Casts zu Union und/oder Type-Punning zu verunstalten um ein 
paar Assembler-Instruktionen rauszuhacken ist nicht wirklich eine gute 
Idee.

In der portablen C99 Variante
1
#include <stdint.h>
2

3
uint16_t glue (uint8_t lo, uint8_t hi)
4
{
5
    return (hi << 8) | lo;
6
}
Gibe es 5 Operationen: Ein Shift, ein Or, zwei 8->16 Promotions und eine 
16-Bit Zuweisung.

GCC verliert hier leider gerne den Überblick über das Gesamtbild, das 
sich dem Assembler-affinen Programmierer als 2 8-Bit Zuweisungen 
darstellt, die bei geschickter Umsetzung des umgebenden Codes sogar 
entfallen können.

Diese Diskrepanz ist es, welche "erfahrene" Entwickler zu Union-Hacks 
greifen lässt. Aber führt man das Szenario konsequent fort, frogrammiert 
man Assembler in C und hackt sich hinter jeder verlorenen Instruktion 
her...

Dann sieht der Code irgendwann aus wie Sauerkraut, obwohl die Ursache 
zwo Assembler-Instruktionen von einer Compiler-Version waren, die schon 
seit Jahren nicht mehr eingesetzt wird. Und keiner rafft's mehr. Weder 
was wirklich im Code passiert, nach warum es genau so passiert.

Und Ja, das Problem ist im GCC bekannt: PR41076. Und ja, auch 
GCC-Entwickler wissen wie guter Code auszusehen hat und sind nicht 
komplett doof ;-)
Gast #2522771
Wäre es dann Sinnvoll die oben genannte "Funktion" als Inline zu 
deklarieren?
Dann würde man sich doch die Funktionseinprünge sparen, oder?

Gruß
#2522972
Wobei "inline" ja auch nur eine Empfehlung ist und vom Compiler nicht 
zwangsläufig befolgt wird. Umgekehrt kann der Compiler auch automatisch 
eine Funktion inline expandieren, wenn es dem Optimizer sinnvoll 
erscheint. Bei einer derart kurzen und einfachen Funktion kann man 
eigentlich drauf wetten.
#2523138
LittleBigEndian schrieb:
> Johann L. schrieb:
>> Bei der Union ist das Ergebnis nicht portabel, ist also mithin von
>> verwendeter Plattform und Compiler abhängig (ein avr-gcc ist was anderes
>> als ein arm-gcc).
>
> Das stimmt so nicht.

Doch, das stimmt. Und wenn man es streng nach ISO C sieht, geht es sogar 
noch einen Schritt weiter: Da ist nicht einmal definiert, was überhaupt 
passiert, wenn du solche Schweinereien versuchst.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.