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

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

07.06.2019, 16:31. Показов 8147. Ответов 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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2019, 21:17
Цитата Сообщение от Jin X Посмотреть сообщение
И константный объект, зашитый в EXE-шнике и ссылку на объект, который может быть удалён.
string_view как раз для этого. Если он не доступен, то можно написать свою легкую реализацию.

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

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надеюсь, ты понимаешь, что это полная фигня?
Присоединяюсь.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
07.06.2019, 22:24  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Он её в рантайме вычисляет
Почему он её в рантайме будет вычислять, когда она constexpr ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.06.2019, 22:40
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Так там одинаковые вызовы и одинаковое содержимое
Я же привел версию выше. Где ж оно одинаковое? Там внутри __builtin_strlen используется.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru