Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

21

09.12.2015, 16:19

Die union Loesung ist explizit verboten, da nicht auf einen anderen Member als den zuletzt gesetzten zugegeriffen werden darf. Siehe dazu auch hier, Kapitel 9.5 Abschnitt 1: http://www.open-std.org/jtc1/sc22/open/n2356/class.html

Zitat

In a union, at most one of the data members can be active at any time


Damit sind bestimmte Optimierungen moeglich, z.b. das Lesen/ Schreiben in der Union umverteilt werden kann. Eine solche kann dann zu Fehlern fuehren.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

09.12.2015, 16:21

Wie im anderen Thread schon gesagt: Folgende Lösung ist wohl einigermaßen standardkonform (besser wird's in der Hinsicht vermutlich nicht) und generiert unter MSVC, clang und gcc den besten Code, den der jeweilige Compiler hergibt (seriously impressed by clang 8o ):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstdint>
#include <limits>
#include <cstring>

std::uint32_t float_as_int(float f)
{
  static_assert(sizeof(float) == sizeof(std::uint32_t), "float not 32 bits wide");
  static_assert(std::numeric_limits<float>::is_iec559, "float not IEEE 754 compliant");
  
  std::uint32_t i;
  std::memcpy(&i, &f, sizeof(std::uint32_t));

  return i;
}

float int_as_float(std::uint32_t i)
{
  static_assert(sizeof(float) == sizeof(std::uint32_t), "float not 32 bits wide");
  static_assert(std::numeric_limits<float>::is_iec559, "float not IEEE 754 compliant");
  
  float f;
  std::memcpy(&f, &i, sizeof(std::uint32_t));
  
  return f;
}

int main()
{
  return int_as_float(float_as_int(42.0f));
}

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (09.12.2015, 16:28)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

09.12.2015, 16:44

Die union Loesung ist explizit verboten, da nicht auf einen anderen Member als den zuletzt gesetzten zugegeriffen werden darf. Siehe dazu auch hier, Kapitel 9.5 Abschnitt 1: http://www.open-std.org/jtc1/sc22/open/n2356/class.html

Zitat

In a union, at most one of the data members can be active at any time


Damit sind bestimmte Optimierungen moeglich, z.b. das Lesen/ Schreiben in der Union umverteilt werden kann. Eine solche kann dann zu Fehlern fuehren.

Nicht nur das; ohne diese Regel wäre schon rein prinzipiell das C++ Objektmodell in seinen Grundfesten verletzt, da zwei (lebende) Objekte (complete objects) dann plötzlich die selbe Adresse haben könnten...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (09.12.2015, 16:51)


Werbeanzeige