Forum: Compiler & IDEs std::bit_cast nun auch im gcc / avr-gcc


von Wilhelm M. (wimalopaan)


Lesenswert?

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
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Ich denke, das freut auch die ARM und RISC-V Anwender ;-)

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

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..

von Wilhelm M. (wimalopaan)


Lesenswert?

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++?

von MArtin (Gast)


Lesenswert?

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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von A. B. (Gast)


Lesenswert?

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.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.