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

OP #6499215
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
}
Persönliche Seite #6499559
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.
Gast #6506206
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..
OP #6506238
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++?
Gast #6506240
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.
OP #6506242
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.
Gast #6506509
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.
Moderator Persönliche Seite #6506688
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.