Ich möchte genauer verstehen, wenn neu interpret_cast sicher ist und wenn es undefiniertes Verhalten verursacht. Im Folgenden finden Sie ein Beispielprogramm, das ich zur Diskussion zusammengestellt habe. Ich verstehe, dass Memcpy an ein vorhandenes Objekt definiert ist, aber solange es trival_copybar ist. Ich bin daran interessiert, wie der neuinterpret_cast gut definiert ist oder nicht.#include
#include
template
void serialize(T const& source, unsigned char* buffer) {
std::memcpy(buffer, &source, sizeof(T));
}
template
T deserialize(unsigned char* buffer) {
T entity;
std::memcpy(&entity, buffer, sizeof(T));
return entity;
}
template
T* view_as(unsigned char* buffer) {
return reinterpret_cast(buffer);
}
struct point {
int x;
int y;
};
int main() {
point p1{1,2};
point p2{3,4};
alignas(point) unsigned char buffer[2 * sizeof(point)];
// These calls should be fine as we are copying trivally copyable types to a correctly aligned buffer
serialize(p1, buffer);
serialize(p2, buffer + sizeof(point));
// I believe memcpying a buffer to an object that has its lifetime started is valid
auto p3 = deserialize
(buffer);
auto p4 = deserialize(buffer + sizeof(point));
// As I copied these in and they were originally valid objects can I do the following 2 lines safely
auto* p5 = view_as(buffer);
auto* p6 = view_as(buffer + sizeof(point));
return 0;
}
< /code>
Ich habe einige Ausnahmen aus dem C ++ 17 -Standard genommen, um auf den Wert eines Objekts mit einem Zeiger auf einen anderen Typ zuzugreifen, der hier angegeben ist. UNDEFINDIERT: 63 < /sup> < /p>
(11.1) Der dynamische Typ des Objekts, < /li>
(11.2) Ein cv-qualifizierter Version des dynamischen Typs des Objekts, < /li>
(11.3) Ein ähnlicher Typ (wie in 7.5). Objekt, < /li>
(11.4) Ein Typ, der der signierte oder nicht signierte Typ ist, der dem dynamischen Typ des Objekts entspricht, < /li>
(11.5) Ein Typ, der der signierte oder vorgewiesene Typ entspricht, der einer CV-Qualified-Version des dynamischen Typs des Objekts entspricht. Typ, der einen der oben genannten Typen unter seinen Elementen oder nicht
statischen Datenmitgliedern (einschließlich rekursiv, ein Element oder ein nicht statisches Datenmitglied eines Subaggregats oder
enthält) enthält, < /li>
(li>(11.7) Ein Typ, der ein (möglicherweise cv-qualifiziertes Basis-Basis-Klassen-Typ-Typ-Typ-Typ-Typ des dynamischen Typs des dynamischen Typs ist. char, unsigned char oder std :: byte type. Was ist der beste Weg, um eine optimale Leistung und Sicherheit zu erhalten, wenn dies möglich ist?
Undefiniertes Verhalten und neu interpret_cast ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post
-
-
Mit TableOutput, Lesen Sie mit TableClient: String zum Int Cast -Fehler, schreiben
by Anonymous » » in C# - 0 Replies
- 7 Views
-
Last post by Anonymous
-