2016-06-15 2 views
4

Рассмотрим следующую программу:SizeOf оператора и выравнивание в C++ против D

#include <iostream> 
class T { 
    char c; 
    int i; 
}; 
int main() { 
    std::cout<<sizeof(T)<<'\n'; 
} 

Это дает выход 8 как ожидается, из-за выравнивания. Компилятор C++ добавляет пробел в 3 байта. Но если я делаю то же самое на языке D, это дает мне совершенно неожиданный результат. (См видеодемонстрацию here.)

import std.stdio; 
class T { 
    char c; 
    int i; 
} 
int main() { 
    writefln("sizeof T is %d",T.sizeof); 
    writefln("sizeof char is %d",char.sizeof); 
    writefln("sizeof int is %d",int.sizeof); 
    return 0; 
} 

Выход я получаю:

sizeof T is 4 
sizeof char is 1 
sizeof int is 4 

Как sizeof(T) это 4? Я ожидал получить 8 как результат размера класса.Как D-компилятор выполняет выравнивание здесь? Я что-то неправильно понимаю? Я использую Windows 7 32-разрядную ОС & Компилятор Dmd.

ответ

8

Классы в D являются ссылочными типами (то есть они работают как на Java или C#). Когда вы объявляете переменную типа T (где T - это класс), вы объявляете только ссылку на класс (которая по умолчанию будет равна null), которая будет указывать на фактические данные класса (и int i в вашем примере) , Таким образом, T.sizeof измеряет только размер ссылки, которая будет равна размеру указателя (результат 4 указывает только на то, что вы нацеливаете 32-битную платформу).

Try объявляя T как struct:

import std.stdio; 
struct T { 
    char c; 
    int i; 
} 
int main() { 
    writefln("sizeof T is %d",T.sizeof); 
    writefln("sizeof char is %d",char.sizeof); 
    writefln("sizeof int is %d",int.sizeof); 
    return 0; 
} 

На моей машине, вышеуказанные результаты:

sizeof T is 8 
sizeof char is 1 
sizeof int is 4 
+0

так 'sizeof' оператор дает всегда 4, как выход, так как классы ссылочного типа. Правильно ? – Destructor

+0

Да, и, если быть более точным, 'sizeof' всегда дает 4 при настройке 32-разрядных архитектур. При компиляции для 64-битного 'sizeof' ссылки на класс будет 8. –

+0

Хорошо, мне нужно подождать 6 минут, чтобы принять этот правильный ответ !!! – Destructor

Смежные вопросы