2013-09-24 21 views
8

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 
+0

'# Pragma pak sonsuza olmayan bir taşınabilir uzantısı olacak. Bazı mimariler, hizalanmamış bellek erişimlerini desteklemez. –

cevap

10

alignas#pragma pack yerini alamaz

aşağıda benim test kodudur.

GCC, alignas bildirimini kabul eder, ancak yine de üyeyi düzgün bir şekilde hizalanmış halde tutar: en sıkı hizalama gereksiniminin karşılanması (bu durumda, long'un hizalaması), belirttiğiniz gereksinimi de karşılar. Standart aslında açıkça paragraf 5, §7.6.2 bu yasaklar olarak

Ancak GCC fazla hafif geçerli: Bence

The combined effect of all alignment-specifiers in a declaration shall not specify an alignment that is less strict than the alignment that would be required for the entity being declared if all alignment-specifiers were omitted (including those in other declarations).

İlgili konular