2015-10-21 2 views
3

Почему следующий код возвращает 12 в кодовых блоках 13.12 и 20 в visual studio 2010? Я также смущен, почему он возвращает любое другое значение, чем 0, поскольку векторы являются динамическими, и я не отбрасывал никаких элементов.Почему sizeof возвращает разное значение для разных IDE?

#include <iostream> 
#include <sstream> 
#include <iomanip> 
#include <string> 
#include <stdio.h> 
#include <vector> 
using namespace std; 

class c 
{ 
public: 
    vector<int>v; 
    c() 
    { 
     v.clear(); 
    } 
}; 
int main() { 
    int m; 
    c ob; 
    cout<< sizeof(ob); 

} 
+3

Подумайте, как реализовать вектор, и вы можете понять, почему размер вряд ли когда-либо будет 0. Как минимум, он будет содержать, например, указатель и счетчик. Помните, что размер вектора не совпадает с размером содержимого вектора. – icabod

+4

btw его компилятор, который компилирует ваш код, а не IDE – user463035818

+0

Также это не потому, что у вектора нет элемента, который он не потребляет.Я не знаю реализации вектора, но он может иметь свои собственные внутренние атрибуты: указатель на сохраненные данные (даже если это просто NULL), количество элементов (даже если это всего лишь 0), ... – nlko

ответ

2

Поскольку sizeof оператор показывает вам в памяти размер (в байтах) объектного представления данного типа. Учитывая, что контейнер vector состоит не только из данных (могут быть счетчики, указатели и т. Д.), То точный размер в памяти зависит от реализации в используемом компиляторе.

А в вашем случае есть разные компиляторы зависят от выбранного IDE:

  • Visual C++ в Visual Studio
  • MinGW (скорее всего) в CodeBlocks

Если вы хотите знать точный размер (в байтах) данные внутри вашего vector, то вы можете использовать следующий метод:

int vector_size = sizeof(int) * v.capacity(); 
+1

На самом деле это не IDE, как исходный вопрос, но это также не «компилятор». Именно заголовки библиотеки std отвечают за изменение размера std :: vector. Этот размер также может различаться между сборками отладки и выпуска (из-за условной компиляции в этих заголовках). Если вы используете компилятор, такой как ICC, без собственных заголовков или используете какой-либо компилятор с заголовками, поставляемыми с другим компилятором, большинство таких изменений размера следует за заголовками, а не с компилятором. – JSF

1

Это не вопрос IDE, а компилятора, как говорится в комментариях.

Независимо от того, что obj, конечно, не имеет размера 0, так как содержит хотя бы вектор. Пустой vector просто не содержит какого-либо элемента, но это не означает, что память, которую он использует, равна 0, он может иметь некоторые скрытые необходимые атрибуты.

Различные размеры могут быть обусловлены: различными дополнениями, применяемыми различными компиляторами, и различными реализациями векторов в разных средах разработки.

0

A std::vector может быть реализован по-разному, но для каждого из них требуются три элемента данных. Одним из возможных вариантов эквивалентно

template<typename Tp> 
class vector 
{ 
    typedef Tp*pointer; 
    pointer begin_memory, end_used, end_allocated; 
}; 

, который соответствует sizeof(vector)=3*sizeof(pointer). Однако в качестве альтернативы вы можете заменить один или оба из end_used и end_allocated с элементами типа size_t. Этот макет и аппаратное обеспечение sizeof(pointer) и sizeof(size_t) определяют sizeof(vector): размер в памяти используется std::vector<>.

На 32-битной системе обычно есть sizeof(pointer)=sizeof(size_t)=4 и, следовательно, sizeof(vector)=12.

0

Я хочу что-то добавить, независимо от vector. Даже int не имеет универсального размера среди всех компиляторов (или того, что вы назвали IDE). int находится на наименее 4 байта. Таким образом, он может быть больше.

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