Fehler, Irrtümer, Fragen - Seite 2503

 
Alexey Viktorov:

Was ist also der Fehler?

Sie deklarieren ein Array mit zwei Elementen mit je zwei Bytes und erhalten 4 Bytes, wie es sein sollte. Wo ist die Wanze? Was ist das?

Es geht um Folgendes.

Sie richten es auf 4 aus und 2 Elemente belegen 2*8 Bytes.

Tut mir leid, aber wenn Sie das schreiben, haben Sie das Thema nicht verstanden.

Ähnlich wie bei den Kreuzen:

#include <iostream>
struct alignas(4) A
{
  short j;
};

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

Der Fehler liegt wahrscheinlich nicht hier?

 
Vict:

Es tut mir leid, aber wenn Sie das schreiben, haben Sie das Thema nicht verstanden.

Nein, das scheinen Sie nicht zu verstehen.

//g++  5.4.0

#include <iostream>
#pragma  pack (push, 4)
struct A
{
  short j;
};
#pragma  pack (pop)

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}
 
TheXpert:

Nein, das scheinen Sie nicht zu verstehen.

Das #pragma-Paket aus dem smallmicrosoft-Zeug ist eine sehr merkwürdige Sache (die Art und Weise, wie es jetzt funktioniert, überrascht mich, um ehrlich zu sein). Es überrascht nicht, dass der Standard-Alignas anders funktioniert.

Hier ist mehr:

#include <iostream>
struct A
{
  short j;
} __attribute__((aligned(4)));

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}
 
Vict:

Das #pragma-Paket der kleinen Softwares ist eine sehr merkwürdige Sache (die Art und Weise, wie es funktioniert, überrascht mich jetzt, um ehrlich zu sein). Kein Wunder, dass alignas in der Norm anders funktioniert.

Komm schon!)

#include <iostream>
struct A
{
  short j;
} alignas(4) ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 4
   return 0;
}

#pragma pack funktioniert auch unter gcc gut, und was du geschrieben hast, ist nur ein internes gcc-Attribut, das anders funktioniert als aligned.

 
TheXpert:

Jetzt komm schon.)

#pragma pack funktioniert auch unter gcc einwandfrei, und was Sie geschrieben haben, ist nur ein internes gcc-Attribut, das anders funktioniert als aligned.

Was zeigt dieses Beispiel also? Dass Sie die Verwendung von Alignas nicht herausgefunden haben? Sogar der Compiler schwört auf den Code:

1.cc:7:3: warning: attribute ignored in declaration of 'struct A' [-Wattributes]
    7 | } alignas(4) ;
      |   ^~~~~~~
1.cc:7:3: note: attribute for 'struct A' must follow the 'struct' keyword

Das #pragma-Paket ist eine seltsame kleine Softie-Kreation, die gcc nur aus Kompatibilitätsgründen unterstützt.

 
Vict:

Was zeigt dieses Beispiel also? Dass du noch nicht herausgefunden hast, wie man Alignas benutzt?

Ich stimme zu, ich habe es vermasselt.

Hier ist der richtige Code.

#include <iostream>
struct alignas(4) A
{
  short j;
}  ;

int main()
{
   A q[2];
   std::cout << sizeof(q) << std::endl; // 8
   return 0;
}

alignas ist also nicht mit einer Verpackung vergleichbar.

weil in der gleichen gcc (so dass ohne smallsoft) die Standard-Vielfache der Verpackung ist 8

denn:

#include <iostream>
struct A
{
  short j;
};

struct B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 4 32
   return 0;
}

aber mit alignas(8)

#include <iostream>
struct alignas(8) A
{
  short j;
};

struct alignas(8) B
{
  short j;
  long long k;
};

int main()
{
   A q[2];
   B r[2];
   std::cout << sizeof(q) << " " << sizeof(r) << std::endl; // 16 32
   return 0;
}
 
Und beachten Sie, dass dies das Standardverhalten ist, nicht für die Kompatibilität mit Software
 
TheXpert:
Und beachten Sie, dass dies das Standardverhalten ist, nicht für die Kompatibilität mit Smallmicrosoft

Ich verstehe die Idee nicht. In dem Beispiel ist alles in Ordnung, ich sehe kein Problem. Standard - Strukturausrichtung == die strengste Anforderungsausrichtung unter den Mitgliedern nehmen.

struct {char;} == 1, struct {char;short} == 2, struct {char;int} == 4, usw. Das ist überall so. Und long long == acht, also hat alignas keine Auswirkungen.

 
Vict:

Ich verstehe die Idee nicht. Im Beispiel ist alles in Ordnung, ich sehe das Problem nicht.

Ja, Sie haben Recht, das Beispiel ist kein Indikator.

Die Quintessenz ist, dass mql pack als #pragma pack und nicht als alignas funktioniert.

 
Leute, gebt uns ein paar Informationen. Wofür verwenden Sie Alignment?