С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
13 / 13 / 7
Регистрация: 28.01.2012
Сообщений: 549

Применение std::move к локальной переменной при возврате из функции

06.07.2017, 14:53. Показов 3824. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
Response HostHandler::notFound() const {
    Response resp;
    resp.status = 404;
    return std::move(resp);
}
Имеет ли это смысл?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.07.2017, 14:53
Ответы с готовыми решениями:

Непонятные символы при возврате строки из функции
Всем привет! Работаю с "NVAPI" (Библиотека, которая позволяет работать с видеокартами NVIDIA). В ней есть тип переменной...

Std::move
Добрый вечер, #include <iostream> using namespace std; class A { private: int x = 10; public: A(int q){ x = q; }

std::move()
Есть ли разница между следующими вещами: A = std::move(B); // and std::copy(B.begin(), B.end(), A.begin()); B.clear();

19
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
06.07.2017, 23:47
Нет, не имеет. Rvalue-ссылка всё равно приводится обратно к возвращаемому типу, а ненужное копирование и переносы компилятор сокращает за счёт RVO (в данном случае NRVO).
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.07.2017, 12:41
Цитата Сообщение от hiphone Посмотреть сообщение
Имеет ли это смысл?
да, если хочется подгадить компилятору.
такой явный мув обламывает последнему RVO/NRVO,
соответственного, вместо перфоманса получаем тормоза.
2
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2017, 13:07
Цитата Сообщение от hoggy Посмотреть сообщение
такой явный мув обламывает последнему RVO/NRVO,
std::move - это всего лишь обычный static_cast к rvalue-ссылке. Компилятор отлично способен сообразить, что ему делать с локальными ссылками и ничего у него не обламывается.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.07.2017, 13:52
Цитата Сообщение от Nick Alte Посмотреть сообщение
Компилятор отлично способен сообразить, что ему делать с локальными ссылками и ничего у него не обламывается.
Обламывается. std::move мешает сделать rvo/nrvo.
C++
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
//g++  5.4.0
 
#include <iostream>
 
 
struct Some
{
    Some() {}
    Some(const Some &s) {
        std::cout << "copy" << std::endl;
    }
    Some(Some &&s) {
        std::cout << "move" << std::endl;
    }
};
 
 
 
Some foo()
{
    Some s;
    return std::move(s);
}
 
 
Some bar()
{
    Some s;
    return s;
}
 
 
int main()
{
    std::cout << "foo()\n"; foo();
    std::cout << "bar()\n"; bar();
}
http://rextester.com/NFNUQ30467

Как видите, имеем лишнее перемещение при использовании std::move,
тогда как без него срабатывает оптимизация и нет накладных расходов вовсе.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2017, 14:34
Цитата Сообщение от Croessmah Посмотреть сообщение
std::move мешает сделать rvo/nrvo.
Тогда предлагаю сойтись на следующем:
а) RVO действительно не выполняется из-за того, что move (или даже явный каст в &&) предписывают выполнить перемещение;
б) побочные эффекты такого перемещения (в данном случае, печать) обязаны выполняться;
в) накладных расходов непосредственно на копирование или перемещение компилятор всё равно может избежать, (а может и не избежать, если имеет дело с хитрым объектом со сложным конструктором).

Итого: использование std::move в приведённом примере не нужно, и в некоторых случаях оно может немного понизить производительность, но скорее всего никак на неё не повлияет.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.07.2017, 14:39
Цитата Сообщение от Nick Alte Посмотреть сообщение
использование std::move в приведённом примере не нужно
При возврате локальных переменных (или копий принятых объектов) оно не нужно никогда.
В случае, если компилятор не сможет сделать rvo/nrvo,
он сам выполнит перемещение, если будет такая возможность.
Копирование объектов std::unique_ptr
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.07.2017, 15:03
Цитата Сообщение от Nick Alte Посмотреть сообщение
но скорее всего никак на неё не повлияет.
нет никаких но.

вам выше привели пример,
который иллюстрирует поломку RVO/NRVO
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2017, 15:10
Цитата Сообщение от hoggy Посмотреть сообщение
нет никаких но.
"Поломка" RVO - не вселенская катастрофа и она не означает, что компилятор не сможет исключить переброски объекта по памяти на других стадиях оптимизации. Прежде, чем с необоснованным апломбом высказывать столь категорические суждения, рекомендую зайти на godbolt.org и посмотреть на ассемблерный выхлоп.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.07.2017, 15:15
Цитата Сообщение от Nick Alte Посмотреть сообщение
рекомендую зайти на godbolt.org и посмотреть на ассемблерный выхлоп.
С опцией -O3 получилось:
Assembler
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
foo():
        push    rbp
        push    rbx
        mov     rbp, rdi
        mov     edx, 4
        mov     esi, OFFSET FLAT:.LC0
        mov     edi, OFFSET FLAT:std::cout
        sub     rsp, 8
        call    std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
        mov     rax, QWORD PTR std::cout[rip]
        mov     rax, QWORD PTR [rax-24]
        mov     rbx, QWORD PTR std::cout[rax+240]
        test    rbx, rbx
        je      .L10
        cmp     BYTE PTR [rbx+56], 0
        je      .L5
        movsx   esi, BYTE PTR [rbx+67]
.L6:
        mov     edi, OFFSET FLAT:std::cout
        call    std::basic_ostream<char, std::char_traits<char> >::put(char)
        mov     rdi, rax
        call    std::basic_ostream<char, std::char_traits<char> >::flush()
        add     rsp, 8
        mov     rax, rbp
        pop     rbx
        pop     rbp
        ret
.L5:
        mov     rdi, rbx
        call    std::ctype<char>::_M_widen_init() const
        mov     rax, QWORD PTR [rbx]
        mov     esi, 10
        mov     rax, QWORD PTR [rax+48]
        cmp     rax, OFFSET FLAT:std::ctype<char>::do_widen(char) const
        je      .L6
        mov     rdi, rbx
        call    rax
        movsx   esi, al
        jmp     .L6
.L10:
        call    std::__throw_bad_cast()
bar():
        mov     rax, rdi
        ret
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2017, 15:33
Цитата Сообщение от Croessmah Посмотреть сообщение
С опцией -O3 получилось:
И что же там получилось для структуры Some, в которой нет данных? foo печатает сообщение, а bar не печатает и вообще ничего не делает? Это не сюрприз, побочные эффекты срабатывают, как и должны.

А если брать прямые эффекты, а не побочные, то...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <utility>
 
struct Result {
    int x = 1, y = 2, z = 3, w = 4;
};
 
Result foo() {
    Result r;
    return std::move(r);
}
 
 
Result bar() {
    Result r;
    return r;
}
 
Result baz() {
    Result r;
    return static_cast<Result&&>(r);
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
foo():
        movabs  rax, 8589934593
        movabs  rdx, 17179869187
        ret
bar():
        movabs  rax, 8589934593
        movabs  rdx, 17179869187
        ret
baz():
        movabs  rax, 8589934593
        movabs  rdx, 17179869187
        ret
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
08.07.2017, 15:54
Цитата Сообщение от Nick Alte Посмотреть сообщение
А если брать прямые эффекты, а не побочные
Это называется POD-тип. Кстати, поигрался малость с внутренностями функций.
В ряде случаев код внутри функции без std::move оптимизируется лучше даже с POD-типами.

Другой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Some
{
    Some() {}
    Some(Some &&s)  : 
        m_begin(s.m_begin), 
        m_capacity(s.m_capacity), 
        m_end(s.m_end) 
    {
        s.m_begin = nullptr;
        s.m_capacity = nullptr;
        s.m_end = nullptr;
    }
    int *m_begin;
    int *m_capacity;
    int *m_end;
};
Assembler
1
2
3
4
5
6
7
8
9
foo(int):
        mov     rax, rdi
        mov     QWORD PTR [rdi], 0
        mov     QWORD PTR [rdi+8], 0
        mov     QWORD PTR [rdi+16], 0
        ret
bar(int):
        mov     rax, rdi
        ret
Другими словами, std::move помочь не может, а помешать - запросто, о чем и писалось выше.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
08.07.2017, 16:53
Цитата Сообщение от Croessmah Посмотреть сообщение
В ряде случаев код внутри функции без std::move оптимизируется лучше даже с POD-типами.
В этом случае даже чересчур: функция foo попросту создаёт объект, без лишних перекидываний данных, несмотря на std::move, а bar не делает вообще ничего.

Цитата Сообщение от Croessmah Посмотреть сообщение
Другими словами, std::move помочь не может, а помешать - запросто, о чем и писалось выше.
Так я это же и говорил, не считая той части, где "запросто". Но меня тут начали убеждать, что std::move помешает всегда.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.07.2017, 22:49
Цитата Сообщение от Nick Alte Посмотреть сообщение
Прежде, чем с необоснованным апломбом
у вас со здравым смыслом все в порядке?
с восприятием реальности как?

вам выше код привели.
как RVO/NRVO идут лесом.
и конструктор становится наблюдаем.

Цитата Сообщение от Nick Alte Посмотреть сообщение
рекомендую зайти на godbolt.org и посмотреть на ассемблерный выхлоп.
ассм выхлоп не нужен, что бы понимать:
мув ломает RVO/NRVO оптимизацию.

Цитата Сообщение от Nick Alte Посмотреть сообщение
меня тут начали убеждать, что std::move помешает всегда.
да. всегда.

- а можно просто переменную типа int замувить...
- можно машку за ляжку, козу на возу, не ковыряй в носу!


у вас там похоже ассм головного мозга.
1
Заблокирован
08.07.2017, 23:02
Цитата Сообщение от Nick Alte Посмотреть сообщение
ничего у него не обламывается.
Under the following circumstances, the compilers are permitted, but not required to omit the copy- and move- (since C++11)construction of class objects even if the copy/move (since C++11) constructor and the destructor have observable side-effects. This is an optimization: even when it takes place and the copy-/move-constructor is not called, it still must be present and accessible (as if no optimization happened at all), otherwise the program is ill-formed.
- If a function returns a class type by value, and the return statement's expression is the name of a non-volatile object with automatic storage duration, which isn't the function parameter, or a catch clause parameter, and which has the same type (ignoring top-level cv-qualification) as the return type of the function, then copy/move (since C++11) is omitted. When that local object is constructed, it is constructed directly in the storage where the function's return value would otherwise be moved or copied to. This variant of copy elision is known as NRVO, "named return value optimization"

Как минимум это обламывается. return statement's expression перестаёт быть object with automatic storage duration (with the same type as the function return type) и начинает возвращать какую-то ссылку.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.07.2017, 11:07
Цитата Сообщение от hoggy Посмотреть сообщение
у вас со здравым смыслом все в порядке?
Да, а тебе засчитано +1 очко хамства.
Цитата Сообщение от hoggy Посмотреть сообщение
с восприятием реальности как?
Нормально, тебе +1 хамства.

Цитата Сообщение от hoggy Посмотреть сообщение
вам выше код привели.
как RVO/NRVO идут лесом.
и конструктор становится наблюдаем.
Мне там выше привели пример, где побочные эффекты конструктора становятся видны, потому что обязаны.

Цитата Сообщение от hoggy Посмотреть сообщение
ассм выхлоп не нужен, что бы понимать:
мув ломает RVO/NRVO оптимизацию.
Асм нужен, чтобы понимать, что получается в итоге. Иначе можно закончить так, как ты: молясь на смесь стандарта и своих заблуждений и отвергая реальные факты.

Цитата Сообщение от hoggy Посмотреть сообщение
да. всегда.
Проверим:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <utility>
 
struct Result { int x = 1, y = 2, z = 3, w = 4;};
 
Result foo() {
    Result r;
    return std::move(r);  //Кошмар! Здесь компилятор не сможет сделать NRVO!
}
 
Result bar() {
    Result r;
    return r;
}
 
void snafu(int x)
{
    volatile auto a = foo();
    volatile auto b = bar();
}
производит выхлоп:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foo():
        movabs  rax, 8589934593
        movabs  rdx, 17179869187
        ret
bar():
        movabs  rax, 8589934593
        movabs  rdx, 17179869187
        ret
snafu(int):
        movabs  rax, 8589934593  ; Предварительная загрузка констант
        movabs  rdx, 17179869187
        mov     QWORD PTR [rsp-40], rax   ; Инициализация a.
        mov     QWORD PTR [rsp-32], rdx
        mov     QWORD PTR [rsp-24], rax   ; Инициализация b. Никакой разницы.
        mov     QWORD PTR [rsp-16], rdx
        ret
Как ни удивительно, но даже несмотря на страшный-ужасный std::move переменная a конструируется так же эффективно, как и b, непосредственно в коде вызывающей функции, по тому адресу, по которому и надо было. Именно то, что должна делать NRVO. Никаких потерь производительности не наблюдается, несмотря на крики "всегда! всегда!".

Цитата Сообщение от hoggy Посмотреть сообщение
- а можно просто переменную типа int замувить...
- можно машку за ляжку, козу на возу, не ковыряй в носу!
Хамство ради хамства в чистом виде, ничего информативного. +2 очка.

Цитата Сообщение от hoggy Посмотреть сообщение
у вас там похоже ассм головного мозга.
+1 очко хамства.

Не лучше ль на себя, дружок, оборотиться? Сбавить наглое хамство, повысить внимание к деталям, меньше возводить в абсолют своё кривое понимание стандартов и почаще сверяться с реальностью?

Цитата Сообщение от daun-autist Посмотреть сообщение
Как минимум это обламывается. return statement's expression перестаёт быть object with automatic storage duration (with the same type as the function return type) и начинает возвращать какую-то ссылку.
Вопрос в том, что для компилятора ссылка на локальный объект. Их изначально и замышляли для того, чтобы компилятор мог непосредственно обращаться к объекту, на который ссылаются. Такое происходит в основном во время инлайнинга, когда параметр подставляемой функции становится ссылкой на конкретный локальный объект. Так происходит и при подстановке std::move. И хотя по стандарту компилятор обязан воспроизводить побочные эффекты конструктора перемещения, это не значит, что он не сможет избежать ненужного перекидывания данных.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.07.2017, 11:39
Цитата Сообщение от Nick Alte Посмотреть сообщение
Мне там выше привели пример, где побочные эффекты конструктора становятся видны, потому что обязаны.
нет. не обязаны.

стандарт разрешает компиляторам забить
на все возможные сайд-эффекты конструкторов
в угоду оптимизациям.

в этом и заключается смысл copy elysion как бе.

пример:

http://rextester.com/NIA30417
C++
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
#include <iostream>
 
 
//-------------------------------------------------------------------------        
//---------- кросс-платформенный макрос отображения имени функции ---------
//-------------------------------------------------------------------------        
 
#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    #define dFUNCTION __PRETTY_FUNCTION__
#else
    #ifdef _MSC_VER
        #define dFUNCTION __FUNCSIG__
    #else
        #define dFUNCTION __FUNCTION__
    #endif
#endif
 
#define dVIEW_FUNCTION std::cout << dFUNCTION << std::endl;
 
//-------------------------------------------------------------------------         
//-------------------------------------------------------------------------        
//-------------------------------------------------------------------------       
 
struct sample
{
    sample() { dVIEW_FUNCTION; }
    sample(const sample&) { dVIEW_FUNCTION; }
    sample(sample&&) { dVIEW_FUNCTION; }
    const sample& operator=(const sample&) { dVIEW_FUNCTION; }
    const sample& operator=(sample&&) { dVIEW_FUNCTION; }
};
 
sample nrvo()
{
    sample object;
    return object;
}
 
int main()
{
    auto s2 = nrvo(); 
   
    (void)s2;
}
конструктор копии/мув не наблюдаемы.
внезапно?


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

Цитата Сообщение от Nick Alte Посмотреть сообщение
Асм нужен, чтобы понимать, что получается в итоге.
не нужен.
нужно знать и понимать правила языка.
и этого - достаточно.

Цитата Сообщение от Nick Alte Посмотреть сообщение
Иначе можно закончить так, как ты: молясь на смесь стандарта и своих заблуждений и отвергая реальные факты.
если вы без ассма не в состоянии понять,
к чему приводят конструкции на языке с++,
ну значит вы просто балбес.

C++
1
2
3
4
5
6
7
// функция выносит мозг поциэнтам,
// страдающим от болезни "ассм-головного мозга"
template<class ololo) auto trololo()
{
    ololo object;
    return ::std::move(object); 
}
а если наглядные практические примеры кодом,
которые иллюстрируют наличие/отсутствие побочек конструкторов,
не являются для вас "реальными фактами",
значит вы ещё и не адекватный к тому же.

людей, которые противоречат объективной реальности
называют маразматиками.

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

все прочие могут только грубить.
и я вам не грубил.
0
09.07.2017, 16:53

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
хамить может только нижестоящее лицо вышестоящему
Википедия говорит обратное.

0
Заблокирован
09.07.2017, 19:00
Цитата Сообщение от Nick Alte Посмотреть сообщение
Вопрос в том, что для компилятора ссылка на локальный объект.
Да нет никакого вопроса, написано абсолютно ясно: функция возвращает по значению, а выражение return состоит из имени локального объекта с тем же типом, что и возвращаемое значение у функции. При таких условиях компилятору позволяется не вызывать копирующий или перемещающий конструкторы.

Ни о каких ссылках речи не идёт.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.07.2017, 22:05
Цитата Сообщение от Croessmah Посмотреть сообщение
Википедия говорит обратное.
нет, не говорит.
хотя и искажает.

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

если вам действительно интересно,
то рекомендую вам смотреть в сторону истории происхождения этого понятия,
и толковые словарики аля Ожегова.

в частности,
даже по вашей же ссылке есть пункт касательно России:

В Российской империи дворяне презрительно называли словом «хамство» представителей низших слоёв общества (холоп, лакей)(ц)Викки
вот только викки искажает начальный посыл:
Человек использует тактику хамства в общении с целью явной демонстрации своего превосходства, более высокого социального статуса
(ц)Викки
очевидно, что это не так.
на практике, 99% всех кейсов - банальная грубость,
воспринимаемая "интылэгэнтным" оппонентом:
"он мне нахамииииил!"

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

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

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

для дворянина хам - это холоп, который,
бросил на дворянина косой взгляд,
например.


а в том, что касается реального кейса "демонстрация более высокого статуса",
то для этого случая существует своё отдельное понятие,
называемое "снобизмом".

можете глянуть на викки.
тоже корявенько, но более менее:
https://ru.wikipedia.org/wiki/... 0%BE%D0%B1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2017, 22:05
Помогаю со студенческими работами здесь

Затираются значения при возврате из функции initializer_list
Дарова. Объясните, почему при возврате объекта инитиализер_лист из функции значения этого листа трутся #include &lt;iostream&gt; ...

Особенности использования указателей и ссылок в C++ при возврате из функции
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

Optional и std::move
добрый день. разбираясь в исходниках optional'а из gcc, я понял, что там нигде не делается инвалидным только что перемещенный объект. ...

Почему не вызывается конструктор копирования при возврате объекта из функции
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

Как избежать копирования вектора, при возврате его из функции?
Вопрос простой. В классе есть поле вектор, член - данные. Методом я возвращаю его const std::vector&lt; unsigned char &gt;&amp;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru