2013-02-25 2 views
-2

я написал эту небольшую программу:Поведение пустого класса в C++

#include <iostream> 

using namespace std; 

class a{ 
}; 

int main() 
{ 
a *obj=new a(); 
cout<<sizeof(obj)<<endl; 
cout<<sizeof(*obj)<<endl; 
delete obj; 
} 

Ниже вывод, что я получил:

> ./a.out 
4 
1 
> 

Я могу понять, что его использование 4 байта для хранения адрес объекта. Но я не понимаю, что это 1 байт. Поскольку у него пустой класс, я сомневаюсь в том, что является целью этого 1 байта (размер объекта).

Моим вторым вопросом будет вызываться конструктор по умолчанию? если да, что бы это в основном делало?

+0

Учитесь здесь: [** Каков размер объекта пустого класса? **] (http://stackoverflow.com/questions/621616/c-what-is-the-size-of- a-object-of-a-empty-class) –

+0

У этого также есть второй вопрос, который еще не имеет ответа в данной так называемой дублированной ссылке. – Vijay

+0

@sarthi Хорошо, пожалуйста, рассмотрите мои комментарии my help И эта ссылка может asnwer вторая часть [** Что компилятор добавляет в декларацию пустого класса? **] (http://stackoverflow.com/questions/2659895/what-does -a-compiler-add-to-the-empty-class-declaration) и [** Являются ли пустые конструкторы всегда вызываемыми в C++? **) (http://stackoverflow.com/questions/5097545/are-empty-constructors - всегда-в-в) –

ответ

1

Байт там, потому что размер объекта не может быть 0 в C++. Это фиктивный байт. Подумайте о массиве a - если размер a был 0, все объекты будут расположены по тому же адресу.

Теоретически вызывается пустой конструктор по умолчанию. На практике он оптимизирован, поскольку он не имеет наблюдаемого поведения.

+0

Я не вижу, как нулевой массив подразумевал бы тот же адрес. У вас могут быть нулевые объекты по разным адресам ... – 2013-02-25 12:47:24

+0

@infact Я никогда не говорил нулевой массив ... –

+0

@ lucian..u может быть правильным в отношении второго, но первого. .. Угадайте неправильно. BTW я не downvoting :) – Vijay

0

Первый sizeof распечатывает размер указателя 32-бит в 32-битных системах. Второй sizeof выводит размер a контента, который выровнен по 1 байт, потому что разные объекты должны создавать разные адреса.

Однако вы можете иметь класс нулевого размера, даже с невиртуальными методами:

class A 
{ 
    A() 
    { 
     cout << "Hi" << endl; 
    } 
    char unused[]; 
    // Note: Putting at least a virtual method increases the size to 4 bytes. 
}; 

и

cout << sizeof(A) << endl; // Prints out 0 

Более того, этот код показывает все A объектов расположены в том же адресах памяти :

A a1; 
A a2; 

cout << &a1 << endl; 
cout << &a2 << endl; 

Out говоря:

0x22ff00

0x22ff00

+0

Этот ответ не имеет отношения к заданному вопросу. – Vijay

+1

@sarathi Irrelevant? Зачем? – jogojapan

0

Каждый объект должен иметь четкий адрес, так что объект в C++ имеет минимальный размер 1.

конструктор по умолчанию ничего не делает.

0

, что цель этого 1 байта (размер объекта)

В C++ все различные объекты должны иметь разные адреса. Чтобы достичь этого, все объекты не меньше, чем наименьшая адресуемая единица - то есть один байт.

Моим вторым вопросом будет вызываться конструктор по умолчанию?

Технически, да.Если вы не объявите свой собственный конструктор по умолчанию, тогда он будет неявно сгенерирован, если это необходимо. Неявный конструктор будет строить по умолчанию все элементы и базовые под-объекты. Однако ...

если да, что бы это в основном сделало?

Поскольку класс не имеет членов или суб-объектов, которые нуждаются в инициализации, неявный конструктор тривиального: она ничего не делает.

+0

Любая причина для downvote? Я уверен, что мой ответ верен, хотя, возможно, он замаскирует несколько незначительно релевантных деталей, таких как пустые базовые классы. –

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