Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как из функции вернуть пустой std::map?


Автор: Alca 7.5.2009, 13:32
Как из функции вернуть пустой std::map?

Автор: zim22 7.5.2009, 13:34
Код

return std::map<int, std::string>();

Автор: azesmcar 7.5.2009, 13:36
Alca

Код

std::map<int, int> foo() {
   return std::map<int, int>();
}


а зачем?
вообще нехорошо это, по ссылке лучше передавать
Код

void foo(std::map<int, int>& r) {
}

опоздал smile 

Автор: Alca 7.5.2009, 13:43
zim22, azesmcar, спасибо. Я так и делал, но колмпилер не хавал.
Оказалось, что лажа была другом месте - в макросе.

Цитата

вообще нехорошо это, по ссылке лучше передавать

Цитата

http://forum.vingrad.ru/topic-229478.html


Автор: azesmcar 7.5.2009, 13:47
Alca

там в самом вопросе написано
Цитата

(без передачи std::map по ссылке или указателю в функцию)


Ну...надо так надо smile

Автор: Alca 7.5.2009, 13:52
Цитата

Ну...надо так надо

Цитата

http://forum.vingrad.ru/topic-229478.html

Там тесты есть. Я делал и так и так - результат сильно не отличается...

Добавлено @ 13:53
azesmcar, попробуй сам потести.

Автор: azesmcar 7.5.2009, 13:59
Цитата(Alca @  7.5.2009,  13:52 Найти цитируемый пост)
azesmcar, попробуй сам потетсти. 

ОК, проверю. Но тесты - это не гарантия. Гарантию дает С++ стандарт, где ясно сказано что при возвращении по значению - вызывается копирующий конструктор. Подсчетом ссылок мап не обладает, а значит данные будут скопированы. Что там натворит оптимизатор - сейчас посмотрю. Но писать код, который будет работать быстро/медленно в зависимости от оптимизатора по любому не стоит smile

Автор: azesmcar 7.5.2009, 14:19
Alca

Вот и результаты тестов подоспели smile 
Все тесты проводились в релиз версии, на Visual Studio 2008
тестируемый код
Код

typedef std::map<int, std::string> strmap;
void foo1(strmap& mp)
{
    std::string v = "123456789123456789123456789123456789123456789";

    for (int i = 0; i < 1000000; ++i)
    {
        mp.insert(strmap::value_type(i, v));
    }
}
strmap foo2()
{
    strmap mp;
    std::string v = "123456789123456789123456789123456789123456789";

    for (int i = 0; i < 1000000; ++i)
    {
        mp.insert(strmap::value_type(i, v));
    }
    return mp;
}


Цитата

вызвращение по значению
Оптимизация: выключена
3250

Оптимизация: включена
688
--------------------------------------------
возвращение по ссылке
Visual Studio 2008
Оптимизация: выключена
2000

Оптимизация: включена
688
--------------------------------------------

Разница 1250 милисекунд. Более секунды. Оптимизатор вероятно просто заинлайнил эту функцию, потому никакой разницы нет при включенном оптимизаторе.. но другой компилятор может так не поступить, причем это даже зависит от функции, будет она инлайн, или нет..может сейчас она и будет, но добавим завтра в нее пару вызовов и получим в результате спад производительности.

Автор: Alca 7.5.2009, 14:22
Можно даже тоже самое проделать с мапом более внушительного размера - будет тоже самое.

Добавлено через 1 минуту и 41 секунду
Цитата

Но писать код, который будет работать быстро/медленно в зависимости от оптимизатора по любому не стоит

 smile 

Автор: azesmcar 7.5.2009, 14:29
Цитата(Alca @  7.5.2009,  14:22 Найти цитируемый пост)
Можно даже тоже самое проделать с мапом более внушительного размера - будет тоже самое.

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

Автор: Alca 7.5.2009, 14:33
 smile , ты не понял. Просто размер мапа не влияет на скорость возврата значения по ссылке или по значению.

Автор: azesmcar 7.5.2009, 14:35
Цитата(Alca @  7.5.2009,  14:33 Найти цитируемый пост)
 smile , ты не понял. Просто размер мапа не влияет на скорость возврата значения по ссылке или по значению. 

если оптимизация отключена - влияет.
см. тесты

Цитата(azesmcar @  7.5.2009,  13:59 Найти цитируемый пост)
а писать код, который будет работать быстро/медленно в зависимости от оптимизатора по любому не стоит 


Автор: J0ker 7.5.2009, 17:12
Цитата(Alca @  7.5.2009,  14:33 Найти цитируемый пост)
ты не понял. Просто размер мапа не влияет на скорость возврата значения по ссылке или по значению

это что-то новенькое
инлайнинг выключите и посмотрите
а вообще лучше матчасть поучите

Автор: Alca 7.5.2009, 17:38
Цитата

это что-то новенькое
инлайнинг выключите и посмотрите
а вообще лучше матчасть поучите

А кто сказал что я собирался не инлайнить?

Автор: J0ker 7.5.2009, 17:59
Цитата(Alca @  7.5.2009,  17:38 Найти цитируемый пост)
А кто сказал что я собирался не инлайнить?

а кто сказал, что компилятор учитывает ваше выраженнное вербально нежелание инлайнить

Автор: Alca 7.5.2009, 18:09
Цитата

а кто сказал, что компилятор учитывает ваше выраженнное вербально нежелание инлайнить

возьму на заметку  smile 

Автор: xvr 12.5.2009, 19:30
Цитата(azesmcar @ 7.5.2009,  14:19)
Alca

Вот и результаты тестов подоспели smile 
Все тесты проводились в релиз версии, на Visual Studio 2008
тестируемый код
Код

typedef std::map<int, std::string> strmap;
void foo1(strmap& mp)
{
    std::string v = "123456789123456789123456789123456789123456789";

    for (int i = 0; i < 1000000; ++i)
    {
        mp.insert(strmap::value_type(i, v));
    }
}
strmap foo2()
{
    strmap mp;
    std::string v = "123456789123456789123456789123456789123456789";

    for (int i = 0; i < 1000000; ++i)
    {
        mp.insert(strmap::value_type(i, v));
    }
    return mp;
}


А можно посмотреть как вызывалась функция foo2? У меня есть подозрение, что вызывалась она примерно так:
Код

strmap rv=foo2();
Если да, то попробуй так
Код

strmap rv;
rv=foo2();
rv=foo2();
Замерять 2й вызов.

Автор: azesmcar 12.5.2009, 20:14
xvr


Цитата(xvr @  12.5.2009,  19:30 Найти цитируемый пост)
А можно посмотреть как вызывалась функция foo2? У меня есть подозрение, что вызывалась она примерно так:

Как угодно..это совершенно не важно, хоть вот так
Код

foo1();

разница в скорости будет заметная.

Автор: xvr 13.5.2009, 09:50
Цитата(azesmcar @ 12.5.2009,  20:14)
xvr


Цитата(xvr @  12.5.2009,  19:30 Найти цитируемый пост)
А можно посмотреть как вызывалась функция foo2? У меня есть подозрение, что вызывалась она примерно так:

Как угодно..это совершенно не важно, хоть вот так
Код

foo1();

разница в скорости будет заметная.

Где? 688-688  smile Неоптимизированная версия не очень интересна

В случае map<..> p=foo(); и map<...> p; ... p=foo(); разница может быть, так как в первом случае может сработать RVO, а во втором вряд ли

Автор: azesmcar 13.5.2009, 09:58
Цитата(xvr @  13.5.2009,  09:50 Найти цитируемый пост)
Где? 688-688  smile Неоптимизированная версия не очень интересна

речь идет как раз о неоптимизированной версии. Писать код в надежде на оптимизатор на мой взгляд не очень хорошо. А так, с оптимизатором - без разницы.

Автор: xvr 13.5.2009, 13:16
Цитата(azesmcar @ 13.5.2009,  09:58)
Цитата(xvr @  13.5.2009,  09:50 Найти цитируемый пост)
Где? 688-688  smile Неоптимизированная версия не очень интересна

речь идет как раз о неоптимизированной версии. Писать код в надежде на оптимизатор на мой взгляд не очень хорошо.

Неа  smile Если нужна скорость - включай оптимизации по полной. А если скорость не нужна, то и затраты на возврат map из функции уже не важны.  smile 

Но в данном случае я согласен, что лучше передавать map по ссылке - скорость будет максимальная вне зависимости от контекста применения (оптимизатор НЕ СМОЖЕТ сделать RVO для любого контекста)

Автор: azesmcar 13.5.2009, 13:44
Цитата(xvr @  13.5.2009,  13:16 Найти цитируемый пост)
Неа  smile Если нужна скорость - включай оптимизации по полной. А если скорость не нужна, то и затраты на возврат map из функции уже не важны.  smile 

я не говорил что ее надо отключать

Цитата(xvr @  13.5.2009,  13:16 Найти цитируемый пост)
скорость будет максимальная вне зависимости от контекста применения 

вот то что я имел ввиду smile

или точнее
На оптимизатор надейся, а сам не плошай

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)