2013-04-09 41 views
2

我不明白它的行爲。我認爲這是錯誤的。包含GLKVectors的結構會導致問題。這是一個簡單的代碼。你認爲這是一個合適的結果嗎?sizeof()爲包含GLKVector3,GLKVector4變量的結構返回錯誤的大小

// Test.h 
#import <GLKit/GLKit.h> 

typedef struct 
{ 
    GLKVector2 v1; 
    float f1; 
} V2F1; 

typedef struct 
{ 
    GLKVector2 v1; 
    GLKVector2 v2; 
} V2V2; 

typedef struct 
{ 
    GLKVector3 v1; 
    GLfloat f1; 
} V3F1; 

typedef struct 
{ 
    GLKVector3 v1; 
    GLKVector2 v2; 
} V3V2; 

typedef struct 
{ 
    GLKVector3 v1; 
    GLKVector3 v2; 
} V3V3; 

typedef struct 
{ 
    GLKVector3 v1; 
    GLKVector4 v2; 
} V3V4; 


typedef struct 
{ 
    GLKVector4 v1; 
    GLfloat f1; 
} V4F1; 

typedef struct 
{ 
    GLKVector4 v1; 
    GLKVector2 v2; 
} V4V2; 

typedef struct 
{ 
    GLKVector4 v1; 
    GLKVector3 v2; 
} V4V3; 

typedef struct 
{ 
    GLKVector4 v1; 
    GLKVector4 v2; 
} V4V4; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; 
} V4F2; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; 
} V4F3; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; float f4; 
} V4F4; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; float f4; float f5; 
} V4F5; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; float f4; float f5; float f6; 
} V4F6; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; float f4; float f5; float f6; float f7; 
} V4F7; 

typedef struct 
{ 
    GLKVector4 v1; 
    float f1; float f2; float f3; float f4; float f5; float f6; float f7; float f8; 
} V4F8; 

@interface Test : NSObject 
@end 


// Test.m 
#include "Test.h" 
@implementation Test 
+ (void)doTest 
{ 
#define ConfirmSize(s_) size == s_ ? @"" : [NSString stringWithFormat:@" (!%d)", s_] 
    int size = 0; 
    NSLog(@"Size of V2F1 = %d%@", size = sizeof(V2F1), ConfirmSize(12)); 
    NSLog(@"Size of V2V2 = %d%@", size = sizeof(V2V2), ConfirmSize(16)); 
    NSLog(@"Size of V3F1 = %d%@", size = sizeof(V3F1), ConfirmSize(16)); 
    NSLog(@"Size of V3V2 = %d%@", size = sizeof(V3V2), ConfirmSize(20)); 
    NSLog(@"Size of V3V3 = %d%@", size = sizeof(V3V3), ConfirmSize(24)); 
    NSLog(@"Size of V3V4 = %d%@", size = sizeof(V3V4), ConfirmSize(28)); 
    NSLog(@"Size of V4F1 = %d%@", size = sizeof(V4F1), ConfirmSize(20)); 
    NSLog(@"Size of V4V2 = %d%@", size = sizeof(V4V2), ConfirmSize(24)); 
    NSLog(@"Size of V4V3 = %d%@", size = sizeof(V4V3), ConfirmSize(28)); 
    NSLog(@"Size of V4V4 = %d%@", size = sizeof(V4V4), ConfirmSize(32)); 
    NSLog(@"Size of V4F1 = %d%@", size = sizeof(V4F1), ConfirmSize(20)); 
    NSLog(@"Size of V4F2 = %d%@", size = sizeof(V4F2), ConfirmSize(24)); 
    NSLog(@"Size of V4F3 = %d%@", size = sizeof(V4F3), ConfirmSize(28)); 
    NSLog(@"Size of V4F4 = %d%@", size = sizeof(V4F4), ConfirmSize(32)); 
    NSLog(@"Size of V4F5 = %d%@", size = sizeof(V4F5), ConfirmSize(36)); 
    NSLog(@"Size of V4F6 = %d%@", size = sizeof(V4F6), ConfirmSize(40)); 
    NSLog(@"Size of V4F7 = %d%@", size = sizeof(V4F7), ConfirmSize(44)); 
    NSLog(@"Size of V4F8 = %d%@", size = sizeof(V4F8), ConfirmSize(48)); 
} 
@end 

以下是[Test doTest]的結果。

的iOS:

Size of V2F1 = 16 (!12) 
Size of V2V2 = 16 
Size of V3F1 = 16 
Size of V3V2 = 24 (!20) 
Size of V3V3 = 24 
Size of V3V4 = 32 (!28) 
Size of V4F1 = 32 (!20) 
Size of V4V2 = 32 (!24) 
Size of V4V3 = 32 (!28) 
Size of V4V4 = 32 
Size of V4F1 = 32 (!20) 
Size of V4F2 = 32 (!24) 
Size of V4F3 = 32 (!28) 
Size of V4F4 = 32 
Size of V4F5 = 48 (!36) 
Size of V4F6 = 48 (!40) 
Size of V4F7 = 48 (!44) 
Size of V4F8 = 48 

OSX:

Size of V2F1 = 12 
Size of V2V2 = 16 
Size of V3F1 = 16 
Size of V3V2 = 20 
Size of V3V3 = 24 
Size of V3V4 = 32 (!28) 
Size of V4F1 = 32 (!20) 
Size of V4V2 = 32 (!24) 
Size of V4V3 = 32 (!28) 
Size of V4V4 = 32 
Size of V4F1 = 32 (!20) 
Size of V4F2 = 32 (!24) 
Size of V4F3 = 32 (!28) 
Size of V4F4 = 32 
Size of V4F5 = 48 (!36) 
Size of V4F6 = 48 (!40) 
Size of V4F7 = 48 (!44) 
Size of V4F8 = 48 

我的Xcode的版本是4.6.1。

回答

3

填充是特定於實現的 - 如果您需要更多控制,您可以嘗試使用alignedpackedattributes進行播放。

例如:

__attribute__((packed)) 

記住,具有這些屬性玩可能會導致portability issues

+0

啊哈。所以這沒有錯。對?謝謝。 – Wisebee 2013-04-09 16:19:35

+1

不,這沒有錯。 Compiler先生有權按照他認爲合適的方式進行包裝和包裝。 – 2013-04-09 16:50:08