Элементарный вопрос по контейнерам.

Тема в разделе "Общие вопросы по С и С++", создана пользователем wombat, 4 май 2007.

Статус темы:
Закрыта.
  1. wombat

    wombat Гость

    Есть код:
    Код (Text):
    #include "stdafx.h"
    namespace std{};
    using namespace std;
    #include "vector"


    class CMyClass{
    public:
    CMyClass(){printf("Create\n");}
    CMyClass(const CMyClass &src){printf("Copy create\n");};
    ~CMyClass(){printf("Delete\n");}

    void SayHello(){printf("Hi\n");};
    void SaySomething(){printf("Something\n");};
    };

    int main(int argc, char* argv[])
    {
    vector<CMyClass> aMyClassVector2;

    CMyClass temp;
    temp.SayHello();

    aMyClassVector2.push_back(temp);
    aMyClassVector2.push_back(temp);

    return 0;
    }
    По идее, результат, появляющийся на экране должен иметь вид:
    однако имеем:
    Внимание вопрос: откуда взялся еще один элемент в контейнере?

    P.S. Ногами не бейте - я на старости лет решил наконец то разобраться с C :rolleyes:
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    А поставить точку в конструкторе и отладиться? Заодно и нам расскажешь.

    Да, рискну предположить что это копирование элементов при расширении вектора. В таком случае если добавить еще один элемент то должно удвоиться еще раз.
     
  3. wombat

    wombat Гость

    Таки да, это memory reallocation. Спецы на rsdn были быстрее :rolleyes:
     
  4. tansa

    tansa Гость

    В моменте, когда создается вектор. Ты туда даешь тип данных. Для того, чтобы знать его размер делается объект. На сколько я знаю именно так работает sizeof. Делает копию и мереет.
     
  5. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    не меряет. а sizeof это вообще операция времени компиляции
     
  6. tansa

    tansa Гость

    Ну вообще да... ерунду я спи***нул.
    Весь STL работает на том, что копирует и хранит копии, а объекты можно сразу вываливать.
    Только то что siezof это часть компилятора верить мне не охота.
    как тогда объяснить факт, чтo скорость работы петли с sizeof'ом реально зависит от того const или нет дается sizeof'у?
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Гм. Ну загляни в асм сгенеренный, если верить не охота.
     
  8. tansa

    tansa Гость

    гы:D
    Верить не охота так же сильно как и в асме рыться :D
     
  9. Kmet

    Kmet Well-Known Member
    Java Team

    Регистрация:
    25 май 2006
    Сообщения:
    1.018
    Симпатии:
    1
    sizeof операция времени компиляции и не может быть другой, т.к. С\С++ языки со статической типизацией, и в обзем случае(RTTI не рассматриваем) информации о типе в run-time получить не возможно.
     
  10. Гость

    <!--QuoteBegin-wombat+4:05:2007, 08:23 -->
    <span class="vbquote">(wombat @ 4:05:2007, 08:23 )</span><!--QuoteEBegin-->я на старости лет решил наконец то разобраться с C
    [snapback]64605" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Ну, во-первых не с С, а с STL, что есть зверь совсем отдельный и своеобразный. Во-вторых, такая трасса еще и от имплеменатации STL зависит, например, в Visual Studi 8 трасса получается вообще такая вот:
    Они там еще во внутреннем STL-овском insert локальную копию делают на всякий случай...

    А лишнее похоже от того, что STL переразмещает массив (поскольку он увеличивается), и копирует все элементы. Извини, но никто не обещал эффективные push/pop на векторе, не для того он.

    Попробуй вот такое:
    и увидишь:
    (я все эти Create-Create copy-Delete до одной-двух букв сократил)
     
Загрузка...
Похожие Темы - Элементарный вопрос по
  1. Генералл
    Ответов:
    2
    Просмотров:
    68
  2. ApplePen
    Ответов:
    0
    Просмотров:
    76
  3. gURaBA_N
    Ответов:
    3
    Просмотров:
    94
  4. ghost
    Ответов:
    1
    Просмотров:
    89
  5. kartaman
    Ответов:
    0
    Просмотров:
    128
Статус темы:
Закрыта.

Поделиться этой страницей