std::bit_cast nun auch im gcc / avr-gcc

OP #6499215
Hallo zusammen,

nach einiger Wartezeit ist nun auch im gcc das std::bit_cast angekommen. 
Damit sollte sich das type-punning Thema für C++ nun erledigt haben ;-)
1
# include <cstdint>
2
# include <cstring>
3
# include <cstddef>
4
# include <bit>
5
# include <array>
6

7
using to_t   = std::array<int16_t, 2>;
8

9
namespace {
10
    volatile uint8_t from2[sizeof(to_t)]{1, 2, 3, 4};
11
}
12
int main() {
13
    constexpr uint8_t from1[sizeof(to_t)]{1, 2, 3, 4};
14
    constexpr auto v1 = std::bit_cast<to_t>(from1); // constexpr bit_cast now working
15
    
16
    const auto v2 = std::bit_cast<to_t>(from2); // same as below
17

18
    const auto v3 = []{
19
        to_t data;
20
        std::memcpy(&data, (void*)&from2, sizeof(to_t)); // not usable in constexpr-context
21
        return data;
22
    }();
23

24
    return v1[0] + v2[0] + v3[0];
25
}
Persönliche Seite #6499559
Wilhelm M. schrieb:
> std::bit_cast nun auch im ... avr-gcc
1
> # include <cstdint>
2
> # include <cstring>
3
> # include <cstddef>
4
> # include <bit>
5
> # include <array>

Interessant, d.h. avr-gcc installiert jetzt standardmäßig auch die C++ 
Header?  Hätte nicht gedacht, dass sich da mal jemand erbarmt. Ist zwar 
gefühlt 10–15 Jahre zu spät, und gerade wo sich avr-gcc in einer 
Überlagerung von "tot" und "Zombie" existiert — aber immerhin.
Gast #6506206
Wilhelm M. schrieb:
> constexpr auto v1 = std::bit_cast<to_t>(from1); // constexpr
> bit_cast now working
>
>     const auto v2 = std::bit_cast<to_t>(from2); // same as below
>
>     const auto v3 = []{

Ich bemühe ich meinen Code so zu schreiben, das ich ihn auch in ein paar 
Jahren noch lesen kann. Daher vermeide ich gerne Konstrukte, die zwar 
elegant aber unverständlich sind.

Welches Buch muß ich lesen um obigen Code zu verstehen?
Im K&R steht's nicht drin, der behandelt aber auch kein C++.

P.S.: Habe auch kein Studium der Informatik hinter mir..
OP #6506238
Bernd schrieb:
> Wilhelm M. schrieb:
>> constexpr auto v1 = std::bit_cast<to_t>(from1); // constexpr
>> bit_cast now working
>>
>>     const auto v2 = std::bit_cast<to_t>(from2); // same as below
>>
>>     const auto v3 = []{
>
> Ich bemühe ich meinen Code so zu schreiben, das ich ihn auch in ein paar
> Jahren noch lesen kann. Daher vermeide ich gerne Konstrukte, die zwar
> elegant aber unverständlich sind.

Was ist denn für Dich unverständlich?
Oder schreibe es doch so, wie Du es für verständlich hälst.

> Welches Buch muß ich lesen um obigen Code zu verstehen?

Ein C++20-Buch, wenn es das gibt.

> Im K&R steht's nicht drin, der behandelt aber auch kein C++.

Du kennst schon den Unterschied zwischen C und C++?
Gast #6506240
Wilhelm M. schrieb:

>> Im K&R steht's nicht drin, der behandelt aber auch kein C++.
>
> Du kennst schon den Unterschied zwischen C und C++?

Kannst du nicht einmal einen einfachen Sachverhalt erfassen oder aus 
welchem absurdem Grund kommt deine dämliche Frage?

Siehe Hervorhebung oben von mir.
OP #6506242
MArtin schrieb:
> Wilhelm M. schrieb:
>
>>> Im K&R steht's nicht drin, der behandelt aber auch kein C++.
>>
>> Du kennst schon den Unterschied zwischen C und C++?
>
> Kannst du nicht einmal einen einfachen Sachverhalt erfassen oder aus
> welchem absurdem Grund kommt deine dämliche Frage?

Genau deswegen wundert es mich, dass Du K&R überhaupt erwähnst. Ist doch 
totaler Bullshit an dieser Stelle.
Gast #6506509
es geht um https://en.cppreference.com/w/cpp/numeric/bit_cast
*************************************************************
Ist jetzt verfügbar unter x86-64 gcc trunk_ und _x86-64 clang trunk 
mit -std=c++20 in libstdc++-v3/include/std/bit:

Source:
*********************************************************************
1
#if __cplusplus > 201703l && __has_builtin(__builtin_bit_cast)
2
#define __cpp_lib_bit_cast 201806L
3

4
  /// Create a value of type `To` from the bits of `from`.
5
  template<typename _To, typename _From>
6
    constexpr _To
7
    bit_cast(const _From& __from) noexcept
8
    {
9
      return __builtin_bit_cast(_To, __from);
10
    }
11
#endif
**********************************************************************
Netiquette : Wer sich für c++ nicht interessiert, soll doch bitte 
einfach weiter klicken und nicht auf Threads antworten, die überhaupt 
nicht interessieren.
Moderator Persönliche Seite #6506688
A. B. schrieb:
> Netiquette

Aproppos Netiquette: Bitte zukünftig C/C++-Code in
1
[c]
2
   ....
3
[/c]

einfassen, wie es auch unter "Antwort schreiben" beschrieben ist. Deine 
langen Sternchen-Zeilen kannst Du dann auch weglassen - der Code wird 
durch den Hintergrund und Farbe bei Schlüsselwörtern hervorgehoben.

Bei Ansicht mit Proportionalschrift (z.B. auf Mobilgerät) sah Dein Code 
nämlich wie Matsche aus. Ich habe das mal für Deinen Beitrag korrigiert.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 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.