Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Работа со строковой константой / 14 сообщений из 14, страница 1 из 1
26.11.2019, 10:11
    #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
26.11.2019, 10:17
    #39894289
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строковой константой
Код: plaintext
1.
2.
char path[] = "/dev/spidev0.0";
file=spi_init(path);



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



?

да. спасибо. так не ругается.
...
Рейтинг: 0 / 0
26.11.2019, 12:58
    #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
26.11.2019, 13:51
    #39894472
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строковой константой
OoCc
правильнее

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

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

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

ИМХО Сходу так утяжелять не стоит. Это же полноценная копия с выделением памяти, в конце - освобождение, т.е. совсем не быстро.
...
Рейтинг: 0 / 0
26.11.2019, 14:42
    #39894509
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строковой константой
Dima T,
Согласен
...
Рейтинг: 0 / 0
26.11.2019, 22:19
    #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
26.11.2019, 23:38
    #39894779
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа со строковой константой
полудух
wstring вообще не оптимизирован
string хотя бы на конкатенациях (.append() или +=) не сильно выёживается, там всего 2-3 аллокации на 15 конкатенаций
а wstring как из пулемёта...

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

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


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

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

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

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

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


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


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