Hatalar, hatalar, sorular - sayfa 2503

 
Alexey Viktorov :

Peki, bug nedir?

her biri iki bayt olan bir dizi mz iki öğe bildirirsiniz ve olması gerektiği gibi 4 bayt alırsınız. Hata nerede? Neyin içinde?

Ama bu

4 hizalıdır ve 2 eleman 2*8 bayt alacaktır.

Kusura bakmayın ama bunu yazarsanız konuyu anlamamış olursunuz.

Haçlarda analog:

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

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

Belki de hata burada değildir?

 
Vict :

Kusura bakmayın ama bunu yazarsanız konuyu anlamamış olursunuz.

Hayır, anlamıyor gibisin.

 //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 :

Hayır, anlamıyor gibisin.

Küçük-yumuşak olanlardan #pragma paketi çok tuhaf bir şey (dürüst olmak gerekirse, çalışma prensibi şimdi beni şaşırttı). Şaşırtıcı olmayan bir şekilde, artık standartta olan alignas farklı çalışıyor.

İşte bir tane daha:

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

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

Küçük-yumuşak olanlardan #pragma paketi çok tuhaf bir şey (dürüst olmak gerekirse, çalışma prensibi şimdi beni şaşırttı). Şaşırtıcı olmayan bir şekilde, artık standartta olan alignas farklı çalışıyor.

evet iyi zaten)

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

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

#pragma paketi gcc'de de harika çalışıyor, ancak yazdıklarınız hizalamadan farklı çalışan dahili bir gcc özelliğinden ibaret.

 
TheXpert :

evet iyi zaten)

#pragma paketi gcc'de de harika çalışıyor, ancak yazdıklarınız yalnızca hizalamadan farklı çalışan dahili bir gcc özelliği.

Peki bu örnek neyi gösteriyor? Hizalama kullanarak neyi anlamadın? Derleyici bile koda yemin ediyor:

 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

#pragma paketi, gcc'nin yalnızca uyumluluk için desteklediği yumuşak paketlerin tuhaf bir hilesidir.

 
Vict :

Peki bu örnek neyi gösteriyor? Hizalama kullanarak neyi anlamadın?

katılıyorum, sıkışmış

işte doğru kod

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

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

alignas'ın paketlemeye benzemediği anlamına gelir.

çünkü aynı gcc'de (böylece küçük-yumuşak olanlar olmadan) varsayılan paketleme oranı 8'dir.

çünkü:

 #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 ;
}

ve burada alignas(8) ile

 #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 ;
}
 
Ve bu varsayılan davranışı not edin ve küçük yazılımlarla uyumluluk için değil
 
TheXpert :
Ve bu varsayılan davranışı not edin ve küçük yazılımlarla uyumluluk için değil

Fikir girmedi. Örnekte her şey yolunda, herhangi bir sorun görmüyorum. Varsayılan - yapı hizalaması == üyeler arasında en katı hizalama gereksinimini alın.

struct {char;} == 1, struct {char;} kısa} == 2, struct {char; int} == 4, vb. Her yerde aynıdır. Ve uzun uzun == sekiz, yani hizalamaların bir etkisi yoktur.

 
Vict :

Fikir girmedi. Örnekte her şey yolunda, herhangi bir sorun görmüyorum.

Evet haklısın örnek gösterge değildir.

Sonuç olarak, mql paketinin alignas gibi değil #pragma paketi gibi çalıştığı ortaya çıktı.

 
İnsanlar, bilgi paylaşın. Hizalamayı ne için kullanıyorsunuz?
Neden: