powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа со строковой константой
14 сообщений из 14, страница 1 из 1
Работа со строковой константой
    #39894288
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть функция
Код: plaintext
1.
2.
3.
int spi_init(char *filename)
{
}



когда компилирую
Код: plaintext
1.
file=spi_init("/dev/spidev0.0");


получаю предупреждение
ISO C++ forbids converting a string constant to 'char*'
что делать?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894289
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
char path[] = "/dev/spidev0.0";
file=spi_init(path);



?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894292
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cerebrum
Код: plaintext
1.
2.
char path[] = "/dev/spidev0.0";
file=spi_init(path);



?

да. спасибо. так не ругается.
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894427
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
Cerebrum
Код: plaintext
1.
2.
char path[] = "/dev/spidev0.0";
file=spi_init(path);



?

да. спасибо. так не ругается.

правильнее сделать параметр функции указателем на константантную строку

Код: plaintext
1.
2.
3.
4.
5.
int spi_init(const char *filename)
{
}

file=spi_init("/dev/spidev0.0");
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894472
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCc
правильнее

А так
int spi_init(std::string s)
?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894473
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
OoCc
правильнее

А так
int spi_init(std::string s)
?

Создавать объект вместо передачи указателя?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894486
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Создавать объект вместо передачи указателя?
преждевременная оптимизация?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894494
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Dima T
Создавать объект вместо передачи указателя?
преждевременная оптимизация?

ИМХО Сходу так утяжелять не стоит. Это же полноценная копия с выделением памяти, в конце - освобождение, т.е. совсем не быстро.
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894509
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Согласен
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894743
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо было вот так писать:
Код: plaintext
1.
int spi_init(std::string_view s)



стринги и выделение памяти это вообще отдельная тема...
я насчитал overдохуа аллокаций new в обычной regex-операции совпадения:
Код: 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.
// 89 alloc... большинство в самой regex.hpp
void f()
{
    // 10 alloc
    vector<wstring> tokens { L"Алексей", L"бибилейка", L"оралешки" } ;
    boost::wregex regex { L"[л]е" } ;

    for (const auto& wstr : tokens)
    {
        wcout << wstr; // 0 alloc
        boost::wsmatch results;
        if (regex_search(wstr, results, regex)){
            wcout << L": " << results[0]; // 0 alloc
        }

        wcout << L'\n'; // 0 alloc
    }

    // 7 alloc
    wstring str {L"Партизан Жора"};
    boost::wregex re {L"(ле)"};
    boost::wsmatch m; // сюда результаты падают
    boost::regex_search(str, m, re);

    wcout << L"cyrillic: " << m[0] << endl; // 0 alloc
}


а с обычным стрингом 21:
Код: 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.
45.
46.
47.
48.
49.
50.
51.
#include <iostream>
#include <string>
#include <vector>
#include <boost/regex.hpp>

using namespace std;

// regex_match(входящая_строка, [результаты_нахождения_соответствий], регулярное_выражение, [флаги]).

static int alloc_cnt = 0;

//##############################################################################
void *operator new(size_t size)
{
    alloc_cnt++;
    cout << "Allocating " << size << " bytes\n";

    return malloc(size);
}
//##############################################################################
void f1()
{
    string str{"AAAA-12222-BBBBB-44455"};
    boost::regex re("(\\w+)-(\\d+)-(\\w+)-(\\d+)");
    boost::smatch m; // сюда результаты падают

    cout << "==========================Results============================== \n";
    cout << "Does this line match our needs? " << boolalpha << boost::regex_match(str, m, re) << "\n";
    cout << "Print entire match:\n " << m[0] << endl;
    cout << "Print the former string into another format:\n"
                                << m[1] << "+"
                                << m[2] << "+"
                                << m[3] << "+"
                                << m[4] << endl;
/* Does this line match our needs? true
Print entire match:
AAAA-12222-BBBBB-44455
Print the former string into another format:
AAAA+12222+BBBBB+44455
*/
}
//##############################################################################
// я бы тут же и wstring потестил, но НЕЛЬЗЯ скрещивать cout И wcout в одной программе...
int main()
{
    system("clear");

    f1();

    cout << "allocations: " << alloc_cnt << endl; // 21 alloc
}


wstring вообще не оптимизирован
string хотя бы на конкатенациях (.append() или +=) не сильно выёживается, там всего 2-3 аллокации на 15 конкатенаций
а wstring как из пулемёта...
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39894779
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
wstring вообще не оптимизирован
string хотя бы на конкатенациях (.append() или +=) не сильно выёживается, там всего 2-3 аллокации на 15 конкатенаций
а wstring как из пулемёта...

Скорее всего в string кажется более оптимизированным из-за того что та же строка в 2 раза меньше памяти занимает, и чаще срабатывает оптимизация коротких строк, когда вместо кучи строка хранится прямо в объекте string.
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39895370
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
надо было вот так писать:
Код: plaintext
1.
int spi_init(std::string_view s)

Ну а почему все-таки копия, а не константная ссылка или указатель?
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39895437
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что у меня был вызов ф-и с голой строкой:
Код: plaintext
1.
prn("строка");


ну да, правильно вот так:
Код: plaintext
1.
int spi_init(const std::string_view &s)
...
Рейтинг: 0 / 0
Работа со строковой константой
    #39895757
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OoCc
jenya7
пропущено...

да. спасибо. так не ругается.

правильнее сделать параметр функции указателем на константантную строку

Код: plaintext
1.
2.
3.
4.
5.
int spi_init(const char *filename)
{
}

file=spi_init("/dev/spidev0.0");


да. лучший вариан.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа со строковой константой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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