오류, 버그, 질문 - 페이지 2503

 
Alexey Viktorov :

글쎄, 버그는 무엇입니까?

각각 2바이트씩 2개의 요소로 구성된 배열을 선언하면 당연히 4바이트를 얻게 됩니다. 버그는 어디에 있습니까? 무엇에서?

하지만 이것은

4-정렬되고 2개의 요소는 2*8 바이트를 차지합니다.

죄송합니다만, 이렇게 쓰시면 주제를 이해하지 못하는 것입니다.

십자가의 아날로그:

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

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

아마도 실수는 여기에 있지 않습니까?

 
Vict :

죄송합니다만, 이렇게 쓰시면 주제를 이해하지 못하는 것입니다.

아니, 이해하지 못하는 것 같다.

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

아니, 이해하지 못하는 것 같다.

small soft의 #pragma pack은 매우 특이한 것입니다. 당연하게도 현재 표준이 된 alignas는 다르게 작동합니다.

여기 또 하나:

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

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

작고 부드러운 것들의 #pragma 팩은 매우 특이한 것입니다(솔직히 말해서, 그 작동 원리는 지금 저를 놀라게 했습니다). 당연하게도 현재 표준이 된 alignas는 다르게 작동합니다.

네 이미 좋아요)

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

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

#pragma pack은 gcc에서도 잘 작동하지만 당신이 작성한 것은 단지 정렬된 것과 다르게 작동하는 내부 gcc 속성일 뿐입니다.

 
TheXpert :

네 이미 좋아요)

#pragma pack은 gcc에서도 훌륭하게 작동하지만 당신이 작성한 것은 단지 정렬된 것과 다르게 작동하는 내부 gcc 속성일 뿐입니다.

그렇다면 이 예는 무엇을 보여줍니까? alignas를 사용하여 이해하지 못한 것은 무엇입니까? 컴파일러조차도 코드에 맹세합니다.

 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 팩은 gcc가 호환성을 위해서만 지원하는 소프트 팩의 이상한 해킹입니다.

 
Vict :

그렇다면 이 예는 무엇을 보여줍니까? alignas를 사용하여 이해하지 못한 것은 무엇입니까?

동의하다, 붙어있다

여기에 올바른 코드가 있습니다

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

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

alignas는 패키징과 유사하지 않음을 의미합니다.

왜냐하면 동일한 gcc에서 (작은 소프트가 없도록) 기본 패킹 비율은 8이기 때문입니다.

왜냐하면:

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

그리고 여기에 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 ;
}
 
그리고 이 기본 동작에 유의하십시오. 작은 소프트와의 호환성을 위한 것이 아닙니다.
 
TheXpert :
그리고 이 기본 동작에 유의하십시오. 작은 소프트와의 호환성을 위한 것이 아닙니다.

아이디어에 빠지지 않았습니다. 예제에서는 모든 것이 정상이며 아무런 문제가 없습니다. 기본값 - 구조체 정렬 == 멤버 중에서 가장 엄격한 정렬 요구 사항을 사용합니다.

구조체 {char;} == 1, 구조체 {char; short} == 2, 구조체 {char; int} == 4 등. 어디에서나 동일합니다. 그리고 long long == 8이므로 alignas는 효과가 없습니다.

 
Vict :

아이디어에 빠지지 않았습니다. 예제에서는 모든 것이 정상이며 아무런 문제가 없습니다.

예, 맞습니다. 예는 지표가 아닙니다.

결과적으로 mql pack은 alignas가 아닌 #pragma pack처럼 작동합니다.

 
여러분, 정보를 공유하세요. 무엇을 위해 얼라인먼트를 사용하고 있습니까?