С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12

Передача строки в качестве параметра

07.06.2019, 16:31. Показов 8007. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
void test(const std::string& str)
{
    std::cout << str;
}
 
int main()
{
  test("Hello my dear friend!\n");
}
Что происходит?
Создаётся временный объект const std::string, конструктор которого принимает (и копирует в себя) const char*, вызывается функция test, затем объект уничтожается. Много лишних действий.

Можно ли сделать так, чтобы в EXE-шнике изначально хранился объект std::string, а не создавался перед вызовом функции?

p.s. В идеале – C++11, но если вариантов нет, рассмотрю что есть.

p.p.s. Интересен также вариант без создания промежуточных констант, если такое возможно, потому что, понятное, дело, можно сделать const std::string text = "Hello my dear friend!\n"; и подставлять её, но это неинтересно. Да и всё равно объект создаётся динамически.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2019, 16:31
Ответы с готовыми решениями:

Передача функции в качестве параметра
Все привет. Помогите в решении следующей проблемы: есть класс XXX, один из методов которого принимает в качестве параметра указатель на...

Передача класса в качестве параметра
Здраствуйте, вообщем есть код class Main: public ExampleApplication { public: void createScene(void) { /* создаем...

Передача пути к файлу в качестве параметра через консоль
Доброго времени суток. Как в самой программе передать в качестве параметра путь к файлу? Понятное дело, что в консоли: путь до файла и...

66
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 21:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи код.
C++
1
2
3
4
5
6
7
#include <thread>
 
int main()
{
  std::this_thread::sleep_for(std::chrono::milliseconds(1000));
  return 0;
}


Code
1
2
3
1.cpp(5): remark #383: value copied to temporary, reference to temporary used
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
                                                          ^
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 21:16
Надеюсь, ты понимаешь, что это полная фигня? Понизь уровень уровень этих ремарков и всё.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2019, 21:17
Цитата Сообщение от Jin X Посмотреть сообщение
И константный объект, зашитый в EXE-шнике и ссылку на объект, который может быть удалён.
string_view как раз для этого. Если он не доступен, то можно написать свою легкую реализацию.

Цитата Сообщение от Jin X Посмотреть сообщение
Не очень понял, к чему этот пример.
К тому, что у меня от ваших вопросов двойственное впечатление. Местами кажется, будто бы вы вообще не в курсе как устроена модель памяти в С++. Решил прощупать почву. А то не понятно, то ли вам нужно объяснять все с самого начала, то ли достаточно простого совета "куда смотреть".

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надеюсь, ты понимаешь, что это полная фигня?
Присоединяюсь.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 21:45  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надеюсь, ты понимаешь, что это полная фигня? Понизь уровень уровень этих ремарков и всё.
Я понимаю, что это не критично, но всё же, увидев это, стало интересно можно ли убрать эту "лишнюю работу".

Цитата Сообщение от DrOffset Посмотреть сообщение
string_view как раз для этого
Да, так выглядит куда веселее
https://godbolt.org/z/XAm-S- (если это имелось в виду)
Жаль, что только C++17. Но всё равно весьма неплохо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 21:55
Цитата Сообщение от DrOffset Посмотреть сообщение
Если он не доступен, то можно написать свою легкую реализацию.
А вот здесь уже не всё так хорошо - компилятор, похоже, стандартную библиотеку компилит как-то по-другому, можно нарваться

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
template <typename TChar>
struct CTest
{
    static constexpr size_t length(const TChar *psz) noexcept
    {
    size_t sz = 0;
    while (psz[sz] != TChar())
            ++sz;
        return sz;
    }
};
 
inline
constexpr void Test(const char *psz) noexcept
{
    const auto sz1= std::char_traits<char>::length(psz); //compile-time
    const auto sz2 = CTest<char>::length(psz); //RUNTIME!!!!
    printf("%u, %u", sz1, sz2);
}
 
int main()
{
    static constexpr char _psz[] = "12345678901234567";
 
    Test(_psz);
 
    const auto sz1 = std::char_traits<char>::length(_psz); //compile-time
    const auto sz2 = CTest<char>::length(_psz); //compile-time
    printf("%u, %u", sz1, sz2);
 
    return 0;
}
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:21  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
компилятор, похоже, стандартную библиотеку компилит как-то по-другому
Этот код в 17 нормально компилит.
Строку с пометкой "RUNTIME!!!" нормально проглатывает.

Добавлено через 1 минуту
Что, в общем-то неудивительно: https://en.cppreference.com/w/... its/length
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:23
Цитата Сообщение от Jin X Посмотреть сообщение
Этот код в 17 нормально компилит.
Строку с пометкой "RUNTIME!!!" нормально проглатывает.
Он её в рантайме вычисляет, а остальные - в compile-time
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:23  [ТС]
Ой, не с пометкой RUNTIME (она и так работает нормально), а где char_traits::length используется.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:24
Причём код вообще никак не отличается от char_traits::length
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:24  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Он её в рантайме вычисляет
Почему он её в рантайме будет вычислять, когда она constexpr ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2019, 22:25
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А вот здесь уже не всё так хорошо - компилятор, похоже, стандартную библиотеку компилит как-то по-другому, можно нарваться
Волков бояться - в лес не ходить.
Да и std::char_traits - то как раз везде доступен.

Добавлено через 39 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Причём код вообще никак не отличается от char_traits::length
Отличается:
C++
1
2
3
4
5
6
7
8
9
static _GLIBCXX17_CONSTEXPR size_t
      length(const char_type* __s)
{
#if __cplusplus >= 201703L
    if (__constant_string_p(__s))
      return __gnu_cxx::char_traits<char_type>::length(__s);
#endif
    return __builtin_strlen(__s);
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:27
Цитата Сообщение от Jin X Посмотреть сообщение
Почему он её в рантайме будет вычислять, когда она constexpr ?
У меня тот же вопрос

Добавлено через 53 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Волков бояться - в лес не ходить.
Да и std::char_traits - то как раз везде доступен.
Проблема в том, что один и тот же код компилируется по-разному

Добавлено через 53 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Отличается:
Декларация одинаковая. Да и попробуй тупо скопировать.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:30  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У меня тот же вопрос
Я компилил через GCC, поэтому всё нормально работало.
А вот Clang / MSVC ругаются, но не на неё, а не Test, потому что там printf. Уберите и всё будет ок
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:35
Цитата Сообщение от Jin X Посмотреть сообщение
Компилил GCC, поэтому нормально работало.
А вот Clang / MSVC ругаются, но не на неё, а не Test, потому что там printf. Уберите и всё будет ок
Проблема не printf, а в том что длина строки, где написано RUNTIME вычисляется в цикле. В остальных - подставляется константа, 17.
Убери эту строку
const auto sz2 = 0; //CTest<char>::length(psz); //RUNTIME!!!!
увидишь, что код стал меньше
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2019, 22:36
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Декларация одинаковая.
Ты смотришь общую версию, а надо специализацию для char. Декларация не при чем. Принятие решения о constexpr`овости функции происходит исходя из ее содержимого.

Добавлено через 48 секунд
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
а в том что длина строки, где написано RUNTIME вычисляется в цикле.
Это не проблема.
Это нормально работает, начиная с С++14.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:39
Цитата Сообщение от DrOffset Посмотреть сообщение
Ты смотришь общую версию, а надо специализацию для char. Декларация не при чем. Принятие решения о constexpr`овости функции происходит исходя из ее содержимого.
Так там одинаковые вызовы и одинаковое содержимое

Цитата Сообщение от DrOffset Посмотреть сообщение
Это не проблема.
Это нормально работает, начиная с С++14.
Это проблема, когда у тебя вызывается strlen для констант
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.06.2019, 22:40
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Так там одинаковые вызовы и одинаковое содержимое
Я же привел версию выше. Где ж оно одинаковое? Там внутри __builtin_strlen используется.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:40  [ТС]
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
#include <stdio.h>
#include <string>
#include <type_traits>
 
template <typename TChar>
struct CTest
{
    static constexpr size_t length(const TChar *psz) noexcept
    {
    size_t sz = 0;
    while (psz[sz] != TChar())
            ++sz;
        return sz;
    }
};
 
std::pair<size_t,size_t> Test(const char *psz) noexcept
{
    const auto sz1= std::char_traits<char>::length(psz); //compile-time
    const auto sz2 = CTest<char>::length(psz); //RUNTIME!!!!
    return std::make_pair(sz1,sz2);
}
 
int main()
{
    static constexpr char _psz[] = "12345678901234567";
 
    auto a = Test(_psz);
    printf("%u, %u\n", a.first, a.second);
 
    const auto sz1 = std::char_traits<char>::length(_psz); //compile-time
    const auto sz2 = CTest<char>::length(_psz); //compile-time
    printf("%u, %u\n", sz1, sz2);
 
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.06.2019, 22:41
DrOffset, Попробуй сделать, чтоб у макроса __FILE__ возвращалось только имя файла, без пути, всегда только в compile-time
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6809 / 2049 / 238
Регистрация: 14.12.2014
Сообщений: 4,300
Записей в блоге: 12
07.06.2019, 22:43  [ТС]
То, что я прислал в 11 только не проканает, т.к. там constexpr-функция должна состоять из одной инструкции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2019, 22:43
Помогаю со студенческими работами здесь

Передача строки в качестве аргумента потоку
Создаю массив handle'ов HANDLE threads; Есть массив, состоящий из 5 символов &quot;ABCDE&quot; char symb; Создаю потоки...

Передача функции в качестве параметра
Как передать функцию с параметрами в transform? Т.е., например, мне надо из каждого числа вектора вычесть число k с помощью transform'а,...

Передача файла в качестве параметра
Как, в качестве параметра, передать функции файл и структуру??? Добавлено через 1 час 1 минуту Разве никто не знает???

Передача функции в качестве параметра
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x) { return (2*x*x)-(exp(x)); double...

Передача CString в качестве параметра функции
Добрый всем вечер! Мучает один вопрос, на который не могу найти ответ. Как наилучшим образом передавать объект класса CString в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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 Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru