2009-07-15 2 views
0

ПриветствияПолучения окончательного числа байт последнего члена

Я могу найти размер в байтах поля после того, как обивка, используя offsetof() макрос.

Что-то вроде

 

struct a 
{ 
    char r ; 
    char s[ 255 ] ; 
} ; 

// the size in bytes of r after compiler padding is going to be 
int lenR = offsetof(a, s) - offsetof(a, r) ; 

Но как я могу найти размер в байтах последнего поля из структуры?

ответ

4

Как насчет:

int lenS = sizeof(a) - offsetof(a, s); 
+0

Ack, ты меня опередил на 20 секунд. –

1

Я считаю, что размер первого элемента вашей структуры всегда будет равен sizeof(char), а размер второго элемента вашей структуры будет sizeof(char[255]). Любое дополнение, которое компилятор решает вставить, зависит от компилятора, и эта память не принадлежит вам. Другими словами, эта память не соответствует вашему приложению, и любая попытка ее использования может привести к неопределенному поведению. Тем не менее, вы все равно можете всегда находить (и часто нужно) общий размер структуры, используя sizeof(struct a). Таким образом, размер полей - это то, что вы ожидаете от них, а отступы не учитываются в отдельных полях, даже если они увеличивают общий размер структуры.

3

Перетяжка не является частью той или иной области, это часть самой структуры. Если у меня есть, как-структуру

struct foo { 
    T1 v1; 
     // <--- some padding here (A) 
    T2 v2; 
     // <--- some padding here (B) 
    T3 v3; 
}; 

ли набивка часть v1? v2 ?. Is B часть v2? v3? Если вы беспокоитесь о том, чтобы заполнять messing с выполнением таких вещей, как сохранение структуры в файле или подобное, большинство (все?) Компиляторов имеют механизм, позволяющий отключить отладку структуры даже на основе структуры по структуре. Чтобы узнать размер последнего члена вашей структуры, в этом случае s, используйте sizeof, например.

struct a tmp; 
size_t size = sizeof(tmp.s); 

Если вы не хотите, чтобы создать временный вы можете воспользоваться тем, что SizeOf происходит во время компиляции и ничего не делать во время выполнения и сделать что-то вроде:

namespace { 
    const a& dummy_func(); 
} 
size_t size = sizeof(dummy_func().s); 

Dummy func не нужно реализовывать когда-либо.

Другой вариант

struct a { 
    ... 
    typedef char s_type[255]; 
    s_type s; 
}; 
size_t size = sizeof(a::s_type); 
Смежные вопросы