2013-04-09 1 views
2

Я не понимаю, что это такое поведение. Я думаю, что это неправильно. Проблема связана с конструкцией, которая содержит GLKVectors. Вот простые коды. Считаете ли вы, что это подходящий результат?sizeof() возвращает неправильный размер для struct, который содержит 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 

версия My Xcode является 4.6.1.

ответ

3

Прокладка является специфичной для реализации - если вам требуется больше контроля, вы можете попробовать сыграть с aligned и packedattributes.

Например:

__attribute__((packed)) 

Имейте в виду, что играть с этими атрибутами потенциально может привести к portability issues.

+0

Ah ha. Так что это не так. Правильно? Благодарю. – Wisebee

+1

Нет, это не так. Г-н Компилятор имеет право надеть и упаковать по своему усмотрению. –