powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / аллокация вектора
68 сообщений из 68, показаны все 3 страниц
аллокация вектора
    #39869595
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потестировал простой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
#include <vector>

using namespace std;

//##############################################################################
int main(int argc, char *argv[])
{
    system("clear");

    // вар1 (155 тактов в gdb):
    vector<int> v;
    v.reserve(1000);

    // вар 2 (197):
//    vector<int> v(1000);

    // вар 3, БЕЗ аллокации (133 !!!):
//    vector<int> v;

    for (int i = 0;   i < 1000;   ++i)
        {v.push_back(i);}
}



тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024
через delete + new...
где оно??

компилировал так: g++ -ggdb3 main.cpp
gdb a.out
(gdb) start
(gdb) disas

у варианта 3 asm такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
   0x0000555555554b70 <+0>:     push   %rbp
   0x0000555555554b71 <+1>:     mov    %rsp,%rbp
   0x0000555555554b74 <+4>:     push   %rbx
   0x0000555555554b75 <+5>:     sub    $0x48,%rsp
   0x0000555555554b79 <+9>:     mov    %edi,-0x44(%rbp)
   0x0000555555554b7c <+12>:    mov    %rsi,-0x50(%rbp)
=> 0x0000555555554b80 <+16>:    lea    0xbbe(%rip),%rdi        # 0x555555555745
   0x0000555555554b87 <+23>:    callq  0x5555555549b0 <system@plt>;
   0x0000555555554b8c <+28>:    lea    -0x30(%rbp),%rax
   0x0000555555554b90 <+32>:    mov    %rax,%rdi
   0x0000555555554b93 <+35>:    callq  0x555555554c6c <std::vector<int, std::allocator<int> >::vector()>
   0x0000555555554b98 <+40>:    movl   $0x0,-0x34(%rbp)
   0x0000555555554b9f <+47>:    mov    -0x34(%rbp),%eax
   0x0000555555554ba2 <+50>:    cmp    $0x3e7,%eax
   0x0000555555554ba7 <+55>:    jg     0x555555554bc7 <main(int, char**)+87>
   0x0000555555554ba9 <+57>:    lea    -0x34(%rbp),%rdx
   0x0000555555554bad <+61>:    lea    -0x30(%rbp),%rax
   0x0000555555554bb1 <+65>:    mov    %rdx,%rsi
   0x0000555555554bb4 <+68>:    mov    %rax,%rdi
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>
   0x0000555555554bbc <+76>:    mov    -0x34(%rbp),%eax
   0x0000555555554bbf <+79>:    add    $0x1,%eax
   0x0000555555554bc2 <+82>:    mov    %eax,-0x34(%rbp)
   0x0000555555554bc5 <+85>:    jmp    0x555555554b9f <main(int, char**)+47>
   0x0000555555554bc7 <+87>:    lea    -0x30(%rbp),%rax
   0x0000555555554bcb <+91>:    mov    %rax,%rdi
   0x0000555555554bce <+94>:    callq  0x555555554c88 <std::vector<int, std::allocator<int> >::~vector()>
   0x0000555555554bd3 <+99>:    mov    $0x0,%eax
   0x0000555555554bd8 <+104>:   jmp    0x555555554bf4 <main(int, char**)+132>
   0x0000555555554bda <+106>:   mov    %rax,%rbx
   0x0000555555554bdd <+109>:   lea    -0x30(%rbp),%rax
   0x0000555555554be1 <+113>:   mov    %rax,%rdi
   0x0000555555554be4 <+116>:   callq  0x555555554c88 <std::vector<int, std::allocator<int> >::~vector()>
   0x0000555555554be9 <+121>:   mov    %rbx,%rax
   0x0000555555554bec <+124>:   mov    %rax,%rdi
   0x0000555555554bef <+127>:   callq  0x555555554a20 <_Unwind_Resume@plt>;
   0x0000555555554bf4 <+132>:   add    $0x48,%rsp
   0x0000555555554bf8 <+136>:   pop    %rbx
   0x0000555555554bf9 <+137>:   pop    %rbp
   0x0000555555554bfa <+138>:   retq


у двух других они длиннее...

зы: я правильно угадал, что <+138> это такты?
зыы: gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
...
Рейтинг: 0 / 0
аллокация вектора
    #39869600
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухзы: я правильно угадал, что <+138> это такты?

Нет, адресное смещение.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39869601
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путаешь слова, в листинге же д.б. длина команды в байтах. А такты - я нынче не знаю, насколько это пропорционально байтам команды.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869616
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну тогда, я так понимаю, эффективность надо высчитывать по инструкциям?
по ним там вроде как тоже не особо разницу видно...
вот вар1 (.reserve()):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
   0x0000555555554b70 <+0>:     push   %rbp
   0x0000555555554b71 <+1>:     mov    %rsp,%rbp
   0x0000555555554b74 <+4>:     push   %rbx
   0x0000555555554b75 <+5>:     sub    $0x48,%rsp
   0x0000555555554b79 <+9>:     mov    %edi,-0x44(%rbp)
   0x0000555555554b7c <+12>:    mov    %rsi,-0x50(%rbp)
=> 0x0000555555554b80 <+16>:    lea    0xdce(%rip),%rdi        # 0x555555555955
   0x0000555555554b87 <+23>:    callq  0x5555555549b0 <system@plt>;
   0x0000555555554b8c <+28>:    lea    -0x30(%rbp),%rax
   0x0000555555554b90 <+32>:    mov    %rax,%rdi
   0x0000555555554b93 <+35>:    callq  0x555555554c7c <std::vector<int, std::allocator<int> >::vector()>
   0x0000555555554b98 <+40>:    lea    -0x30(%rbp),%rax
   0x0000555555554b9c <+44>:    mov    $0x3e8,%esi
   0x0000555555554ba1 <+49>:    mov    %rax,%rdi
   0x0000555555554ba4 <+52>:    callq  0x555555554cdc <std::vector<int, std::allocator<int> >::reserve(unsigned long)>
   0x0000555555554ba9 <+57>:    movl   $0x0,-0x34(%rbp)
   0x0000555555554bb0 <+64>:    mov    -0x34(%rbp),%eax
   0x0000555555554bb3 <+67>:    cmp    $0x3e7,%eax
   0x0000555555554bb8 <+72>:    jg     0x555555554bd8 <main(int, char**)+104>
   0x0000555555554bba <+74>:    lea    -0x34(%rbp),%rdx
   0x0000555555554bbe <+78>:    lea    -0x30(%rbp),%rax
   0x0000555555554bc2 <+82>:    mov    %rdx,%rsi
   0x0000555555554bc5 <+85>:    mov    %rax,%rdi
   0x0000555555554bc8 <+88>:    callq  0x555555554e1e <std::vector<int, std::allocator<int> >::push_back(int const&)>
   0x0000555555554bcd <+93>:    mov    -0x34(%rbp),%eax
   0x0000555555554bd0 <+96>:    add    $0x1,%eax
   0x0000555555554bd3 <+99>:    mov    %eax,-0x34(%rbp)
   0x0000555555554bd6 <+102>:   jmp    0x555555554bb0 <main(int, char**)+64>
   0x0000555555554bd8 <+104>:   lea    -0x30(%rbp),%rax
   0x0000555555554bdc <+108>:   mov    %rax,%rdi
   0x0000555555554bdf <+111>:   callq  0x555555554c98 <std::vector<int, std::allocator<int> >::~vector()>
   0x0000555555554be4 <+116>:   mov    $0x0,%eax
   0x0000555555554be9 <+121>:   jmp    0x555555554c05 <main(int, char**)+149>
   0x0000555555554beb <+123>:   mov    %rax,%rbx
   0x0000555555554bee <+126>:   lea    -0x30(%rbp),%rax
   0x0000555555554bf2 <+130>:   mov    %rax,%rdi
   0x0000555555554bf5 <+133>:   callq  0x555555554c98 <std::vector<int, std::allocator<int> >::~vector()>
   0x0000555555554bfa <+138>:   mov    %rbx,%rax
   0x0000555555554bfd <+141>:   mov    %rax,%rdi
   0x0000555555554c00 <+144>:   callq  0x555555554a20 <_Unwind_Resume@plt>;
   0x0000555555554c05 <+149>:   add    $0x48,%rsp
   0x0000555555554c09 <+153>:   pop    %rbx
   0x0000555555554c0a <+154>:   pop    %rbp
   0x0000555555554c0b <+155>:   retq


какой эффективнее?
...
Рейтинг: 0 / 0
аллокация вектора
    #39869631
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухпотестировал простой код:
тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024
через delete + new...
где оно??


оно здесь прячется.
Код: plaintext
1.
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>
...
Рейтинг: 0 / 0
аллокация вектора
    #39869635
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухя так понимаю, эффективность надо высчитывать по инструкциям?

Это бесполезно. Современные процессора могут много странных гитик и "идеальный ассемблер"
на них тормозит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39869662
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухну тогда, я так понимаю, эффективность надо высчитывать по инструкциям?
Забавная методика. А как быть с циклами и ветвлениями? Код может многократно выполняться или вообще не выполняться.

Перевыделение памяти происходит внутри push_back() как уже выше заметили 21983365 . При этом выполняется копирование текущего массива, т.е. в первый раз 2 элемента, во второй 4, затем 8, 16, ...
В твоем случае при 1000 элементов будут скопированы 2+4+8+...512=1022 элемента. Для int это относительно быстро, но замени int на какой-нибудь объект, у которого еще надо конструктор копирования и деструктор вызвать, и получишь более ощутимые тормоза.

Для замера надо время засекать и элементов побольше взять, например, миллион.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869686
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля замера надо время засекать и элементов побольше взять, например, миллион.
Или написать класс с журналированием конструирования и разрушения, поместить его в вектор заместо инта и посмотреть что именно происходит
...
Рейтинг: 0 / 0
аллокация вектора
    #39869709
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо смотреть что под капотом ::push_back. Там не обязательно удвоение. Может быть умножение на полтора.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869813
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserполудухпотестировал простой код:
тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024
через delete + new...
где оно??


оно здесь прячется.
Код: plaintext
1.
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>


хмм, так оно и в варианте с .reserve() есть... почему?
...
Рейтинг: 0 / 0
аллокация вектора
    #39869837
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, попробуй в код вставить

Код: plaintext
1.
#pragma optimize( "", off )
...
Рейтинг: 0 / 0
аллокация вектора
    #39869843
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
тут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024
через delete + new...
где оно??


Так ты же сделал reserve, как раз это и обошёл.
Убери reserve, и поменяй 1000 на 100000
...
Рейтинг: 0 / 0
аллокация вектора
    #39869846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуххмм, так оно и в варианте с .reserve() есть... почему?
Потому что ты ее вызываешь
Код: plaintext
1.
2.
    for (int i = 0;   i < 1000;   ++i)
        {v.push_back(i);}
...
Рейтинг: 0 / 0
аллокация вектора
    #39869850
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

Ну и да, ёмкость увеличивается не на 1 элемент за каждый push_back(), а скачками,
в два раза или что-то такое.

Как именно -- не специфицированно.

Ты можешь совсем ухудшить ситуацию, вызывая каждый раз после push_back()
метод shrink_to_fit(), который уменьшает ёмкость до минимально необходимой,
правда, не гарантировано.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869896
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1000 довольно слабенький объем, чтобы в отладчике увидеть разницу в потреблении памяти приложения.
Попробуйте миллионов сто хотя бы.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869901
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во времена пентиумов, когда оперативная память уже достигла гигабайта, был забавный пример. Аллоцировать двумерный массив 1000_000х3 элемента было невозможно, не хватало памяти. Память аллоцировалась нелинейно, а блоками по 512 байт (по крайней мере на моей машине), поэтому не дойдя до конца вываливалась с нехваткой памяти.
Это больше имеет отношение к ленивой аллокации виртуальной памяти чем к пентиумам.
...
Рейтинг: 0 / 0
аллокация вектора
    #39869939
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНадо смотреть что под капотом ::push_back. Там не обязательно удвоение. Может быть умножение на полтора.
:)
В MSVS 2017 - увеличивается экспоненциально, всякий раз на половину предыдущей емкости.
Но только если есть такая возможность! Иначе - увеличивается на столько, сколько запрошено.
У GCC - вроде бы все еще в 2 раза.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	size_type _Calculate_growth(const size_type _Newsize) const
		{	// given _Oldcapacity and _Newsize, calculate geometric growth
		const size_type _Oldcapacity = capacity();

		if (_Oldcapacity > max_size() - _Oldcapacity / 2)
			{
			return (_Newsize);	// geometric growth would overflow
			}

		const size_type _Geometric = _Oldcapacity + _Oldcapacity / 2;

		if (_Geometric < _Newsize)
			{
			return (_Newsize);	// geometric growth would be insufficient
			}

		return (_Geometric);	// geometric growth is sufficient
		}
...
Рейтинг: 0 / 0
аллокация вектора
    #39870004
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чортов gcc...
...
Рейтинг: 0 / 0
аллокация вектора
    #39870021
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivполудухтут вопрос: а куда делась страшилка про то, что вектор, которому сразу не выдали 1000 эл-тов, будет сначала рожать 2, потом 4, 8, 16, ... ,1024
через delete + new...
где оно??
Так ты же сделал reserve, как раз это и обошёл.
Убери reserve, и поменяй 1000 на 100000
.reserve() только в 1м варианте. В 3м как раз без ничего: vector<int> v;
MasterZivполудух,

Ну и да, ёмкость увеличивается не на 1 элемент за каждый push_back(), а скачками,
в два раза или что-то такое.
и про это я написал тоже.

Dima Tполудуххмм, так оно и в варианте с .reserve() есть... почему?
Потому что ты ее вызываешь
Код: plaintext
1.
2.
    for (int i = 0;   i < 1000;   ++i)
        {v.push_back(i);}


значит та строчка в асме не про то что я спрашивал
я не про .push_back() спрашивал, а "где именно происходит расширение вектора *2/*4/*8 итд, когда вектор изначально инициализирован БЕЗ размера"
...
Рейтинг: 0 / 0
аллокация вектора
    #39870022
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и это расширение ведь должно быть видно и на 1000, зачем 1000000...
...
Рейтинг: 0 / 0
аллокация вектора
    #39870026
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухзначит та строчка в асме не про то что я спрашивал
я не про .push_back() спрашивал, а "где именно происходит расширение вектора *2/*4/*8 итд, когда вектор изначально инициализирован БЕЗ размера"
Та строчка асма за кадром осталась, ты ее код не привел. Команда call - это вызов подпрограммы. Конкретно именно в той подпрограмме (push_back()) происходит реаллокация (при необходимости).
...
Рейтинг: 0 / 0
аллокация вектора
    #39870030
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой код не привёл? сырцы же там в начале

так страшилка в том, что БЕЗ инициализации с размером этот .push_back() должен в цикле расширять вектор постепенно в 2 раза (*2 *4 *8 *16 ... *1024), чем сильно тормозит процесс
вот его я и не вижу в асме
вы говорите "вот он"
а потом "это не он", а push_back()
ну инструкции то по самому расширению где?? Где delete + new и прочие телодвижения?
...
Рейтинг: 0 / 0
аллокация вектора
    #39870034
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может gdb не всё показал...
...
Рейтинг: 0 / 0
аллокация вектора
    #39870035
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"objdump -d" показывает очень сильно больше асма...
...
Рейтинг: 0 / 0
аллокация вектора
    #39870040
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухкакой код не привёл? сырцы же там в начале
Это только main(), а остальное?

Код push_back() начинается с адреса 0x555555554ccc

PS Фигней занимаешься. Код там есть, и в нем все вызовы new/delete есть. От вызова reserve() зависит как часто будет тот код вызываться. Тот код как минимум один раз отрабатывает внутри reserve()
...
Рейтинг: 0 / 0
аллокация вектора
    #39870089
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"остальное" это сырцы вектора?

я не понял, в вышеприведённом асме есть вызовы new/delete в итерации *2 *2 *2 ?
...
Рейтинг: 0 / 0
аллокация вектора
    #39870090
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух"остальное" это сырцы вектора?

Да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39870149
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так они из стандартной библиотеки
доступны каждому в /usr/include/c++
...
Рейтинг: 0 / 0
аллокация вектора
    #39870163
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухдоступны каждому в /usr/include/c++

Вот именно. То есть тебе они тоже доступны и ты легко можешь их посмотреть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39870182
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё-то какой-то фиговый из тебя помощник
...
Рейтинг: 0 / 0
аллокация вектора
    #39870185
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё раз вопрос:
полудухтак страшилка в том, что БЕЗ инициализации с размером этот .push_back() должен в цикле расширять вектор постепенно в 2 раза (*2 *4 *8 *16 ... *1024), чем сильно тормозит процесс
вот его я и не вижу в асме
вы говорите "вот он"
а потом "это не он", а push_back()
ну инструкции то по самому расширению где?? Где delete + new и прочие телодвижения?
если бы я был таким прошаренным в C++, чтобы самому всё расковырять и разобрать асм, я бы тут не спрашивал
Поэтому я пришёл на форум за помощью к экспертам, но по сути вы только усугубили путаницу, а конкретики нет.
Походу вы и сами не такие уж прошаренные в C++.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870192
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, ты изначально взял неверный вектор.

Зачем нужно было идти в ассемблер? Ставки были подняты.

Просто если ты задаешь вопрос по вектору - надо просто и честно задавать вопрос. И не писать собственных домыслов
типа "такты" ...

Да это так. Субъективно.

Надеюсь не обидел.
Если что - извини.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870244
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухещё раз вопрос:
полудухтак страшилка в том, что БЕЗ инициализации с размером этот .push_back() должен в цикле расширять вектор постепенно в 2 раза (*2 *4 *8 *16 ... *1024), чем сильно тормозит процесс
вот его я и не вижу в асме
вы говорите "вот он"
а потом "это не он", а push_back()
ну инструкции то по самому расширению где?? Где delete + new и прочие телодвижения?
если бы я был таким прошаренным в C++, чтобы самому всё расковырять и разобрать асм, я бы тут не спрашивал
Поэтому я пришёл на форум за помощью к экспертам, но по сути вы только усугубили путаницу, а конкретики нет.
Походу вы и сами не такие уж прошаренные в C++.
Дурак задаст вопрос так что не ответит ни один мудрец (с) Народная мудрость
...
Рейтинг: 0 / 0
аллокация вектора
    #39870247
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух расковырять и разобрать асм
Для С/С++ программера это лишнее, т.к. асм-код генерит компилятор и сделать лучше него очень-очень сложно. Уровень компиляторов нынче таков что изучать ассемблер просто невыгодно, можно писать на С/С++ и получать максимальную производительность.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870304
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, а тебя не затруднит съ*бать из моей темы и больше в мои темы не заходить?
спасибо.

maytonполудух, ты изначально взял неверный вектор.

Зачем нужно было идти в ассемблер? Ставки были подняты.

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

такты тут не причём (я про них вообще-то отдельно уточнил)
А свой вопрос я "просто и честно" обозначил сразу (а потом ещё 2 раза обозначил) - хочу увидеть, где там эта страшилка
и единственный способ её увидеть это асм (как ещё то?!)
вот окажется, например, что эти ваши "умные компиляторы" умные, только если вектор обозначен прямо рядом с циклом, а если в другом конце программы, то уже и не умные вовсе...
Так ведь никто так и не ответил - "умный он рядом с циклом" или это асм "не тот".
Полухин, например, говорит, что нет не умные...
По 40000 постов набрали и всё мало им, лопнете же скоро

У меня интерес к теме отладки, а к пустому флуду интереса нет.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870314
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

ты совсем не понимаешь, что ли?

Код: plaintext
1.
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>


Где ты тут увидишь работу аллокатора, если у тебя адреса только по 0x0000555555554bfa, а обращение к 0x555555554ccc идет.

Вот тут 21983854 все, а ты зачем-то в asm полез.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870331
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухА свой вопрос я "просто и честно" обозначил сразу (а потом ещё 2 раза обозначил) - хочу увидеть, где там эта страшилка
и единственный способ её увидеть это асм (как ещё то?!)
С чего вдруг асм наше всё? В асм лезть надо в одном случае - чтобы найти косяк в компиляторе. Для остальных целей достаточно исходников на С++. Исходник std::vector сам найдешь?

PS Удачи, постараюсь запомнить что тебе писать не надо.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870390
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухУ меня интерес к теме отладки, а к пустому флуду интереса нет.
Это называется - перехитрил сам себя. Ты в одном вопросе - протащил сразу несколько вопросов.
На будуще. Если хочешь четкого ответа по теме. Давай сорц. И один вопрос.
У тебя был вопрос? Вопрос. И Свои домыслы. И зачем-то дамп ассемблера. И Отладчик. Зачем?

Вопрос был в С++!! По конкретной С++-ной библиотеке STD!

Вот самое верное решение сейчас будет - закрыть модераторм этот топик и тебе задать одельно другой.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870510
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tт.к. асм-код генерит компилятор и сделать лучше него очень-очень сложно.Оптимизировать одну строчку си-кода асмом сложно.
Но оптимизировать всю программу - все бывает.

"пишите программы просто", и никакая оптимизация не потребуется.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870553
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklin"пишите программы просто", и никакая оптимизация не потребуется.
насколько просто? Может и от метапрограммирования откажемся, оно сложное...
То что "компилятору проще оптимизировать простой код" это я знаю.
А у меня что, сложный код в первом сообщении?
ёёёёёты совсем не понимаешь, что ли?

Код: plaintext
1.
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>



Где ты тут увидишь работу аллокатора, если у тебя адреса только по 0x0000555555554bfa, а обращение к 0x555555554ccc идет.
ахаха, да если бы я это мог читать как книгу и сразу всё понимать, полез бы я сюда?
прикинь, да, я сейчас нахожусь где-то там, где ты был лет 5 назад и тоже не одуплял, зачем callq между двух hex-ов стоит
и кто вообще такой callq

maytonУ тебя был вопрос? Вопрос. И Свои домыслы. И зачем-то дамп ассемблера. И Отладчик. Зачем?
ну мне то позволительно, я же учусь

затем, что асм не обманет.
но я понял, что если есть сырцы, то проще залезть в сырцы, они тоже не обманут (главный посыл этой темы)
...
Рейтинг: 0 / 0
аллокация вектора
    #39870571
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухAklin"пишите программы просто", и никакая оптимизация не потребуется.
насколько просто? Может и от метапрограммирования откажемся, оно сложное...
То что "компилятору проще оптимизировать простой код" это я знаю.
А у меня что, сложный код в первом сообщении?
ёёёёёты совсем не понимаешь, что ли?

Код: plaintext
1.
   0x0000555555554bb7 <+71>:    callq  0x555555554ccc <std::vector<int, std::allocator<int> >::push_back(int const&)>



Где ты тут увидишь работу аллокатора, если у тебя адреса только по 0x0000555555554bfa, а обращение к 0x555555554ccc идет.
ахаха, да если бы я это мог читать как книгу и сразу всё понимать, полез бы я сюда?
прикинь, да, я сейчас нахожусь где-то там, где ты был лет 5 назад и тоже не одуплял, зачем callq между двух hex-ов стоит
и кто вообще такой callq

maytonУ тебя был вопрос? Вопрос. И Свои домыслы. И зачем-то дамп ассемблера. И Отладчик. Зачем?
ну мне то позволительно, я же учусь

затем, что асм не обманет.
но я понял, что если есть сырцы, то проще залезть в сырцы, они тоже не обманут (главный посыл этой темы)

Товарищ.
Я когда-то на асм собаку съел, один раз даже BIOS для компухтера написал.
Так вот. Я дико рад, что мне это знание абсолютно не нужно. Я могу посмотреть, что там генерится, но не смотрю. Ну не нужно мне оно.
Я понимаю, что тебе может быть интересно. Ну ты купи книжечку по асму, да разбирайся, там все в миллион раз проще, чем в С++.
Но зачем через задний проход лезть? С++ для того и используют, чтобы без асма обойтись.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870587
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухзатем, что асм не обманет.
но я понял, что если есть сырцы, то проще залезть в сырцы, они тоже не обманут (главный посыл этой темы)
Офигеть ты реверс-инжинер.

А если-бы целевая платформа была ARM или Cortex? Там - другой ассемблер. Ты-бы тоже изучал другой ассемблер
чтоб понять про то как работает прикладная библиотека std?

Почитай кстати про LLVM просто для расширения кругозора.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870619
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудухзы: я правильно угадал, что <+138> это такты?Нет, это сколько тебе заплатят $, если ты дочитаешь до этой строки.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870666
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonполудухзатем, что асм не обманет.
но я понял, что если есть сырцы, то проще залезть в сырцы, они тоже не обманут (главный посыл этой темы)
Офигеть ты реверс-инжинер.

А если-бы целевая платформа была ARM или Cortex? Там - другой ассемблер. Ты-бы тоже изучал другой ассемблер
чтоб понять про то как работает прикладная библиотека std?

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

ёёёёёТоварищ.
Я когда-то на асм собаку съел, один раз даже BIOS для компухтера написал.
да ты СТРАШНЫЙ человек!
ёёёёёЯ могу посмотреть, что там генерится, но не смотрю. Ну не нужно мне оно.
а процесс профилирования то у тебя в разработке присутствует? кэш-промахи, туда-сюда...
...
Рейтинг: 0 / 0
аллокация вектора
    #39870668
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуха процесс профилирования то у тебя в разработке присутствует? кэш-промахи, туда-сюда...
Ну... расскажи что ты делаешь при кеш-промахах? И самый главный вопрос.
Какая предметная область? Какому бизнесу захотелось эти промахи считать?

Нет я не против что эта тема реально существует. Просто мне интересно кто это заказывает.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870681
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудуххакеры то как то выживают же, не?
на ютубе кстати много кто асм расчехляет

"Не смотрите голливудских фильмов перед обедом." почти (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39870682
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух...
ёёёёёЯ могу посмотреть, что там генерится, но не смотрю. Ну не нужно мне оно.
а процесс профилирования то у тебя в разработке присутствует? кэш-промахи, туда-сюда...

Для каких таких "кэш-промахов" нужен ассемблерный код.
Расскажи.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870683
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне никто ничего не заказывает, я не наёмный кодер
я создаю для своего бизнеса, а само программирование мне интересно сразу по нескольким причинам:
- помогает выжить в современном мире;
- позволяет решать любые рутинные задачи (там ещё и микро-электроника рядом);
- мозги упорядочивает (если перефразировать Ломоносова: "Математику уже затем учить надо, что она ум в порядок приводит", то программирование это "next level");
- с ним легче изучать клетку.

зы: при кэш-промахах я зову маму.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870686
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovполудуххакеры то как то выживают же, не?
на ютубе кстати много кто асм расчехляет

"Не смотрите голливудских фильмов перед обедом." почти (с)

Расчехляют те у кого нет сорцов. У кого есть сорцы - зарабатывают деньги нормальным способом.
И излишек на виски и баб еще остаётся.

Не?
...
Рейтинг: 0 / 0
аллокация вектора
    #39870712
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух....а процесс профилирования то у тебя в разработке присутствует? кэш-промахи, туда-сюда...
За этим копать сюда Intel VTune
...
Рейтинг: 0 / 0
аллокация вектора
    #39870792
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухА у меня что, сложный код в первом сообщении?стл, хотя и удобный (да и то с оговорками), но не шибко идеальный код.
...
Рейтинг: 0 / 0
аллокация вектора
    #39870977
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор ты почитал про LLVM ?
...
Рейтинг: 0 / 0
аллокация вектора
    #39871021
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предлагаешь мне новый язык изучать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// Помимо значений-регистров, в LLVM есть и работа с памятью. Значения в памяти адресуются типизированными указателями.
// Обратиться к памяти можно с помощью двух инструкций: load и store.
// Например:
%x = load i32* %x.ptr        ; загрузить значение типа i32 по указателю %x.ptr 
%tmp = add i32 %x, 5         ; прибавить 5 
store i32 %tmp, i32* %x.ptr  ; и положить обратно
// Инструкция malloc транслируется в вызов одноимённой системной функции и выделяет память на куче, возвращая значение — указатель определённого типа.
// В паре с ней идёт инструкция free.

%struct.ptr = malloc { double, double } 
%string = malloc i8, i32 %length 
%array = malloc [16 x i32] 
free i8* %string
// Инструкция alloca выделяет память на стеке.

%x.ptr = alloca double ; %x.ptr имеет тип double* 
%array = alloca float, i32 8 ; %array имеет тип float*, а не [8 x float]!
// Память, выделенная alloca, автоматически освобождается при выходе из функции при помощи инструкций ret или unwind.
...
Рейтинг: 0 / 0
аллокация вектора
    #39871036
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухпредлагаешь мне новый язык изучать?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// Помимо значений-регистров, в LLVM есть и работа с памятью. Значения в памяти адресуются типизированными указателями.
// Обратиться к памяти можно с помощью двух инструкций: load и store.
// Например:
%x = load i32* %x.ptr        ; загрузить значение типа i32 по указателю %x.ptr 
%tmp = add i32 %x, 5         ; прибавить 5 
store i32 %tmp, i32* %x.ptr  ; и положить обратно
// Инструкция malloc транслируется в вызов одноимённой системной функции и выделяет память на куче, возвращая значение — указатель определённого типа.
// В паре с ней идёт инструкция free.

%struct.ptr = malloc { double, double } 
%string = malloc i8, i32 %length 
%array = malloc [16 x i32] 
free i8* %string
// Инструкция alloca выделяет память на стеке.

%x.ptr = alloca double ; %x.ptr имеет тип double* 
%array = alloca float, i32 8 ; %array имеет тип float*, а не [8 x float]!
// Память, выделенная alloca, автоматически освобождается при выходе из функции при помощи инструкций ret или unwind.



Ты воспринимаешь только то, что тебе хочется? Почему ты просто C++ - исходники stl не изучаешь, к чему эти движения в сторону ассемблера?

Я же привел код из stl, где вычисляется размер увеличения: 21983854 .
...
Рейтинг: 0 / 0
аллокация вектора
    #39871087
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, я имел в виду что мир усложняется. И классическая схема компилляции как в Паскале сорц=>екзешник
уже не работает. Компилляторы двигаются к много-уровневой компилляции. Где будет много промежуточных
фаз. Или будут архитектуры вообще не похожие на Intel.

Нужно ли изучать asm x86? Я лично считаю что можно. Для расширения кругозора. И просто for fun.
Я сам этим грешен. Но к анализу проблемы резервирования памяти std::vector это не имеет отношения.
...
Рейтинг: 0 / 0
аллокация вектора
    #39871128
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёё, это ты к чему вообще написал? У тебя mayton в игноре чтоли

я исходники (не только STL) изучал, изучаю и буду изучать - это всё процесс обучения
а ещё видео с конф регулярно смотрю
вот вчера/сегодня эти, например:
YouTube Video
...
Рейтинг: 0 / 0
аллокация вектора
    #39871129
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, как вы относитесь к метапрограммированию?
...
Рейтинг: 0 / 0
аллокация вектора
    #39871261
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К мета-программированию в С++ ?
...
Рейтинг: 0 / 0
аллокация вектора
    #39871315
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага
...
Рейтинг: 0 / 0
аллокация вектора
    #39871839
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Core Guidelines, T.120: Use template metaprogramming only when you really need to

хмм...
почему-то я думал, что вычисления в compile-time тесно связаны с шаблонами
...
Рейтинг: 0 / 0
аллокация вектора
    #39871843
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухага
Его можно рассматривать как составное из препроцессора (макропроцессора) и из процессора шаблонов.

С первым как-бы всё ясно.

А со вторым есть смешанные чувства. Как от восторга так и до ненависти.
...
Рейтинг: 0 / 0
аллокация вектора
    #39871848
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухCore Guidelines, T.120: Use template metaprogramming only when you really need to

хмм...
почему-то я думал, что вычисления в compile-time тесно связаны с шаблонами
а не, всё ок
авторTemplate metaprogramming is hard to get right, slows down compilation, and is often very hard to maintain.
However, there are real-world examples where template metaprogramming provides better performance than any alternative short of expert-level assembly code.
Also, there are real-world examples where template metaprogramming expresses the fundamental ideas better than run-time code.
For example, if you really need AST manipulation at compile time (e.g., for optional matrix operation folding) there may be no other way in C++.
авторT.121: Use template metaprogramming primarily to emulate concepts
Reason: Until concepts become generally available, we need to emulate them using TMP. Use cases that require concepts (e.g. overloading based on concepts) are among the most common (and simple) uses of TMP.
...
Рейтинг: 0 / 0
аллокация вектора
    #39871851
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕго можно рассматривать как составное из препроцессора (макропроцессора) и из процессора
шаблонов.

Что, в общем-то то же самое, только встроенное в первую фазу компиляции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39871895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению нам выгодно скорее разделять, чем объединять эти фазы. Особенно при анализе проблем.
...
Рейтинг: 0 / 0
аллокация вектора
    #39871951
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какую библиотеку вы бы посоветовали в кач-ве образца кода для большого проекта (десятки тысяч строк)?
типа, "вот так надо писать, чтобы и эффективно, и сопровождать было изи"
...
Рейтинг: 0 / 0
аллокация вектора
    #39871954
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glibc.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
аллокация вектора
    #39871978
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понял, оптимально это брать за образец любой модуль аля vector и разбивать программу на такие же модули
...
Рейтинг: 0 / 0
аллокация вектора
    #39872019
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухкакую библиотеку вы бы посоветовали в кач-ве образца кода для большого проекта (десятки тысяч строк)?
не либа, но принципы SOA.
...
Рейтинг: 0 / 0
68 сообщений из 68, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / аллокация вектора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]