错误、漏洞、问题 - 页 2503

 
Alexey Viktorov:

那么,什么是错误呢?

你声明一个两个元素的数组,每个元素有两个字节,得到的是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:

不,你似乎不明白。

来自smallmicrosoft的#pragma包是一个非常奇特的东西(坦率地说,它的工作原理现在让我很吃惊)。不足为奇的是,标准的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内部的属性,其工作方式与aligned不同。

 
TheXpert:

来吧,已经)。

#pragma pack在gcc上也能正常工作,你所写的只是gcc内部的一个属性,其工作方式与aligned不同。

那么这个例子说明了什么?你还没有搞清楚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包是一个奇怪的小softie创作,gcc只支持其兼容性。

 
Vict:

那么这个例子说明了什么?你还没有搞清楚如何使用对准器?

我同意,我搞砸了。

这里是正确的代码。

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

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

所以alignas并不类似于包装。

因为在同一个gcc中(所以没有smallsoft),包装的默认倍数是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的作用是#pragma pack,而不是alignas。

 
人们,分享一些信息。你用对齐的方法做什么?