Hizalamaların nasıl kullanılacağını anlamaya çalışıyorum, pragma paketi için bir yedek olup olmadığını merak ediyorum, bunu doğrulamak için çok uğraştım ama şanssız. Gcc 4.8.1 (http://ideone.com/04mxpI) kullanarak, her zaman 8 bayt STestAlignas için alırken, pragma paketi ile 5 bayttır. Ne yapmak istediğimi buyuk (STestAlignas) dönüşü yapmak istiyorum 5. Bu kodu clang 3.3 (http://gcc.godbolt.org/) üzerinde çalıştırmayı denedim ama hata aldım:Pragma paketini değiştirmek için alignas nasıl kullanılır?
!! error: istenen hizalama, minimum 8 'long' yazın - alignas kullanımının hemen altında.
Belki de alignas için minimum hizalama değeri var mı? gcc 4.8.1 için
#include <iostream>
#include <cstddef>
using namespace std;
#pragma pack(1)
struct STestPragmaPack {
char c;
long d;
} datasPP;
#pragma pack()
struct STestAttributPacked {
char c;
long d;
} __attribute__((packed)) datasAP;
struct STestAlignas {
char c;
alignas(char) long d;
} datasA;
int main() {
cout << "pragma pack = " << sizeof(datasPP) << endl;
cout << "attribute packed = " << sizeof(datasAP) << endl;
cout << "alignas = " << sizeof(datasA) << endl;
}
sonuç:
pragma pack = 5
attribute packed = 5
alignas = 8
'# Pragma pak sonsuza olmayan bir taşınabilir uzantısı olacak. Bazı mimariler, hizalanmamış bellek erişimlerini desteklemez. –