1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

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

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

    wombat Гость

    Репутация:
    0
    Есть код:
    Код:
    #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

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

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

    wombat Гость

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

    tansa Гость

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

    Kmet Well-Known Member
    Java Team

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

    tansa Гость

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

    grigsoft Well-Known Member

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

    tansa Гость

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

    Kmet Well-Known Member
    Java Team

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

    Репутация:
    0
    <!--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 до одной-двух букв сократил)
     
Загрузка...
Статус темы:
Закрыта.

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