Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
что-то я наткнулся на непонятку внезапно...
auto _out()
{
    string str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return str;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    string str = _out();
    cout << "output: " << str.c_str() << '\n';
}

ЧЯДНТ?
6 май 20, 05:04    [22127907]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
White Owl
Member

Откуда:
Сообщений: 12501
По выходу из функции, все объекты объявленные внутри нее - уничтожаются.
То есть когда ты пытаешься вернуть str.c_str() ты возвращаешь указатель на внутренний буффер уничтоженного объекта.
А когда возвращаешь весь объект целиком - он возвращается через копирование. Объект str лежащий на стеке функции _out() уничтожается, но перед этим делается копирование в объект str лежащий на стеке функции main().
6 май 20, 05:41    [22127925]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
Зря ломаешь копья. Это не С. Это С++. Компилятор поправит твой код и он будет выглядить примерно вот так

string str;

auto _out()
{
    str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    _out();
    cout << "output: " << str.c_str() << '\n';
}
6 май 20, 11:06    [22128020]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
kolobok0
Member

Откуда:
Сообщений: 2104
OoCc,

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

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


(круглый)
6 май 20, 11:42    [22128046]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
полудух,

Все компиляторы оптимизируют это устраняя копирование возвращаемого значения, и по факту функция работает с тем экземпляром куда результат присваивается в вызывающем коде (RVO).
А начиная с С++17 это обязательное поведение.

Так что можете спокойно возвращать строку.
6 май 20, 12:38    [22128082]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.
6 май 20, 12:49    [22128089]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
kolobok0
OoCc,

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

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


(круглый)

Я не призываю писать такой код. Компилятор это сделает сам. И совсем не обязательно именно такой. Мой поинт был чтобы полудух не заморачивался и не думал за компилятор слишком много.

Сообщение было отредактировано: 6 май 20, 13:28
6 май 20, 13:26    [22128120]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
OoCc
Зря ломаешь копья. Это не С. Это С++. Компилятор поправит твой код и он будет выглядить примерно вот так

string str;

auto _out()
{
    str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    _out();
    cout << "output: " << str.c_str() << '\n';
}

и что тут возвращает компилятор?!
как str попал в main() ?
mayton
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.

имеешь ввиду, зачем связываться с char* ?
чтобы отправить в socket
конкретно - в send()

Сообщение было отредактировано: 6 май 20, 15:55
6 май 20, 15:56    [22128261]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
полудух

mayton
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.

имеешь ввиду, зачем связываться с char* ?
чтобы отправить в socket
конкретно - в send()

Что за протокол? Raw?
6 май 20, 16:12    [22128279]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
да обычный стек TCP/IP (AF_INET)
надо клиент-серверную архитектуру организовать на C++
как это ещё сделать?
6 май 20, 16:22    [22128288]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Я пытаюсь понять - это прикладное или системное программирование?

Если системное - то у меня нет вопросов и я удаляюсь.
6 май 20, 16:24    [22128291]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
ну очевидно же, что это низкоуровневый задел
а ты с сокетами через boost::asio ?
6 май 20, 16:42    [22128312]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Я с сокетами уже 15 лет вообще никак. Я - прикладник. У меня - Soap/Http/Rest/GraphQL.

Из самого низкоуровневого был SNMP. Это - ближе всего к пакетам.
6 май 20, 17:05    [22128330]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
Http - это сокеты )
6 май 20, 17:28    [22128352]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....
6 май 20, 17:35    [22128358]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....

Ссылка крутая. Но ГуглТранслейт не справился со словом "Fucken". Это Вы где вычитали?
6 май 20, 17:39    [22128364]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
А зачем вы гуглите то что я пишу? Что там гуглить?
6 май 20, 17:46    [22128373]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
А зачем вы гуглите то что я пишу? Что там гуглить?

Я просто впервые увидел такое слово. Но справился другой переводчик. Значение слова -- как и ожидалось.
6 май 20, 17:51    [22128380]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....

ну конечно в интерфейсе нет
но технически ты работаешь с сокетом
т.е. на мой вопрос "как ты работаешь с сокетами" есть ответ - через API
ну т.е. тот же самый boost::asio, только другой API
хотя там внутри как раз он и может оказаться
6 май 20, 17:58    [22128390]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
полудух
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....

ну конечно в интерфейсе нет
но технически ты работаешь с сокетом
т.е. на мой вопрос "как ты работаешь с сокетами" есть ответ - через API
ну т.е. тот же самый boost::asio, только другой API
хотя там внутри как раз он и может оказаться

Когда мы говорил об ASCIIZ я имел в виду что на прикладном уровне (а Http - это уже прикладной)
вам не нужны примитивы ОС, сокеты, или не дай бох блочные или символьные устройства.
Это всё - завёрнуто в библиотеки и наружу выходят std::string как базовый тип данных
для представления бизнес-информации. 99% это так.
6 май 20, 18:06    [22128395]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

а ведь string приходится копировать в char* ?
именно copy всей строки надо будет сделать, чтобы в сокет передать...

Сообщение было отредактировано: 6 май 20, 18:19
6 май 20, 18:19    [22128406]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

Как это соотносится с непониманием времени жизни переменной?

Posted via ActualForum NNTP Server 1.5

6 май 20, 18:22    [22128409]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
полудух
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

Я рекомендую всячески сопротивляться добавлению в проект каждой новой библиотеки.

Это от разработчика PVS Studio, я согласен абсолютно -- с каждым символом.
6 май 20, 18:25    [22128412]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
полудух
и что тут возвращает компилятор?!
как str попал в main() ?


Ты меня спрашиваешь? Это твой код.

полудух
да обычный стек TCP/IP (AF_INET)
надо клиент-серверную архитектуру организовать на C++
как это ещё сделать?

Найти человека который знает и умеет это делать.
6 май 20, 18:31    [22128415]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
petrav
полудух
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

Я рекомендую всячески сопротивляться добавлению в проект каждой новой библиотеки.

Это от разработчика PVS Studio, я согласен абсолютно -- с каждым символом.

Не согласен с точкой зрения. Она - архаична. И ее можно было реплицировать еще в середине 20-го века
когда любой программный продукт был железом+ОС+приложением 3 в одном.

Современный программный продукт - это зачастую на 90% идея, воплощённая в интеграции системных
средств или платформ Amazon/Google/Azure и собственно вашего кода. Которого обычно мало.
Ваш код - это по сути клей который склеивает готовые решения в одно.

Подход когда вы пилите и свой HttpClient и свой (не дай бох) более сложный драйвер
- отбрасывает вас во времени на много спринтов назад и при таком подходе ваши
конкуренты вас обойдут и выдадут работающий прототип.

Последнее - очень важно. Кто первый вышел на рынок - тот победитель.
Сидельцы и народные умельнцы - здесь обычно остаются за бортом. Они - вне рынка ПО.
Они неинтересны потому-что они задержались и поезд ушел.

Поэтому я очень сильно не поддерживаю С++ - ников в их желании иметь свой "свечной заводик"
на любой случай жизни.
6 май 20, 18:35    [22128420]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

mayton
Последнее - очень важно. Кто первый вышел на рынок - тот победитель.

Стратегия "быстро хапнуть бабла и свалить в закат" - вечна.

Posted via ActualForum NNTP Server 1.5

6 май 20, 18:40    [22128426]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Dimitry Sibiryakov

mayton
Последнее - очень важно. Кто первый вышел на рынок - тот победитель.

Стратегия "быстро хапнуть бабла и свалить в закат" - вечна.

Да.
6 май 20, 18:40    [22128427]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
petrav
пропущено...

Я рекомендую всячески сопротивляться добавлению в проект каждой новой библиотеки.

Это от разработчика PVS Studio, я согласен абсолютно -- с каждым символом.

Не согласен с точкой зрения. Она - архаична. И ее можно было реплицировать еще в середине 20-го века
когда любой программный продукт был железом+ОС+приложением 3 в одном.

Современный программный продукт - это зачастую на 90% идея, воплощённая в интеграции системных
средств или платформ Amazon/Google/Azure и собственно вашего кода. Которого обычно мало.
Ваш код - это по сути клей который склеивает готовые решения в одно.

Подход когда вы пилите и свой HttpClient и свой (не дай бох) более сложный драйвер
- отбрасывает вас во времени на много спринтов назад и при таком подходе ваши
конкуренты вас обойдут и выдадут работающий прототип.

Последнее - очень важно. Кто первый вышел на рынок - тот победитель.
Сидельцы и народные умельнцы - здесь обычно остаются за бортом. Они - вне рынка ПО.
Они неинтересны потому-что они задержались и поезд ушел.

Поэтому я очень сильно не поддерживаю С++ - ников в их желании иметь свой "свечной заводик"
на любой случай жизни.

Вы просто не прочитали раздел на который я дал ссылку. Или прочитали, но не поняли что там написано.
6 май 20, 18:46    [22128431]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
OoCc
Member

Откуда: с Кавказа
Сообщений: 2101
mayton
Последнее - очень важно. Кто первый вышел на рынок - тот победитель.

Совсем не обязательно. Если рынок продукта небольшой тогда и нет смысла рвать когти и переплачивать за разработку в 24-7 режиме. А если большой то место всем хватит, главное чтобы костюмчик сидел продукт был достойный. И тут наоборот, попытка будет только одна и вывести нужно действительно конкурентноспособный продукт.
6 май 20, 18:48    [22128435]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Я давно слежу за продуктами PVS. Но их создатели изначально находились в невыгодном стартовом
положении. Они анализировали самый тяжелый и самый сложный компиллятор в мире.
6 май 20, 18:58    [22128453]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
Я давно слежу за продуктами PVS. Но их создатели изначально находились в невыгодном стартовом
положении. Они анализировали самый тяжелый и самый сложный компиллятор в мире.

Компилятор? Наверное язык? Но кто-то же должен его анализировать. Продукт очень качественный, мирового уровня и отечественный. Повод для гордости.

mayton

Подход когда вы пилите и свой HttpClient и свой (не дай бох) более сложный драйвер
- отбрасывает вас во времени на много спринтов назад и при таком подходе ваши
конкуренты вас обойдут и выдадут работающий прототип.

Почитайте внимательнее статью. Автор как раз и не советует писать свой HttpClient. А Вы, почему-то, прочитали, что советует...
6 май 20, 19:06    [22128458]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton,

Кстати, у меня только что слетела возможность редактировать свои посты. Меня что забанили?

Во, теперь вернулась. Спасибо.

Сообщение было отредактировано: 6 май 20, 19:17
6 май 20, 19:18    [22128469]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
Dimitry Sibiryakov
mayton
Последнее - очень важно. Кто первый вышел на рынок - тот победитель.

Стратегия "быстро хапнуть бабла и свалить в закат" - вечна.

эта стратегия всегда ведёт к саморазрушению и деградации
т.е. что в итоге получает человек? бухает и жрёт = забивает на развитие и разлагается
т.о. она то вечна, но вообще-то у неё довольно предсказуемый и глобальный конец (для всего рода, потому что дети, которых не научили добывать/создавать ресурсы - обречены).

Сообщение было отредактировано: 6 май 20, 19:25
6 май 20, 19:25    [22128472]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
OoCc
полудух
и что тут возвращает компилятор?!
как str попал в main() ?


Ты меня спрашиваешь? Это твой код.

мой код возвращал str, а твой ничего не возвращает
6 май 20, 19:38    [22128480]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
petrav
mayton
Я давно слежу за продуктами PVS. Но их создатели изначально находились в невыгодном стартовом
положении. Они анализировали самый тяжелый и самый сложный компиллятор в мире.

Компилятор? Наверное язык? Но кто-то же должен его анализировать. Продукт очень качественный, мирового уровня и отечественный. Повод для гордости.

Я думаю что я все таки не ошибся. Очень много вопросов языка С++ крутятся вокруг компиллятора.
А именно его контрактов по отношению к реализации в bare-metal. Я-бы даже сказал что у меня
есть личная претезия именно к компилляторам. Сказать что они сложны - это значит не сказать ничего.
Сказать что до сих пор есть сложные соглашения по поводу типов int/char и по поводу того
в какую разрядность они будут собраны. Замечу что этому вопросу 100 лет в обед. И большая
часть вопросов новичков крутятся вокруг "некой слепоты" касаемой разрядностей и платформ.
Фактически наработка опыта в С++ должна проходить не через язык а через систему. Железо.
ОС. И компилляторы. Вы не можете считаться опытным С++ кодером просто зная С++. Собственно
это знание вам не дает ничего. Вы должны носом пропахать практику и поймать грабли разрядности
чтобы понять что здесь будет padding структуры. А здесь символ будет покрывать диапазон 1 байта.
Просто таковы условия. Такой глубины неопределённости уже давно нет в смежных языках и технологиях.
Тип данных - это главный строительный цемент. И очень странно что этому вопросу уделяют мало внимания
в комитетах. За 40 лет практически не было сколь заметных улучшений строгости базовой спеки.
Более того существуют сильно болшие различия в Microsoft C++/Gnu Compiller Collection которые
тоже не решаются на уровне спеки языка а решаются где-то сбоку. Макросы, директивы компиллятора,
опции командной строки. Такого ужаса не существовало в других компилляторах. Они были более
предсказемы. Ну и тип данных строка о котором я говорю уже давно. Я говорю - комитет - утверди
string как фундаментальную единицу компилляции и выброси все библиотечные строки.

Вобщем нечего гордиться. Нет предмета гордости.
6 май 20, 20:03    [22128493]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
Макросы, директивы компиллятора, опции командной строки. Такого ужаса не существовало в других компилляторах. Они были более предсказуемы. Ну и тип данных строка о котором я говорю уже давно.

Да... так и есть. Но, во-первых, у нас выбора нет. Хотя можно найти другую работу. Никто не спорит, что тут у нас в C++ помимо красоты языка, ещё и куча кривизны и костылей.

Но статья, которую я процитировал, в общем, универсальна. И касается всех языков программирования. А автор советует не разрабатывать HttpClient.

Я точно так же видел как отваливается половина сложнейшего приложения на .NET. После обновления Студии. Что-то связанное с удалённым созданием объектов на сервере логики. Хотя использование этого компонента .NET было правильным. В смысле, что мы его и использовали правильно, и правильным было то, что мы его использовали.
6 май 20, 20:30    [22128504]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
Anatoly Moskovsky
полудух,

Все компиляторы оптимизируют это устраняя копирование возвращаемого значения, и по факту функция работает с тем экземпляром куда результат присваивается в вызывающем коде (RVO).
А начиная с С++17 это обязательное поведение.

Так что можете спокойно возвращать строку.

а когда я делаю str.c_str() снаружи, таки копирования не происходит?
6 май 20, 20:39    [22128507]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
полудух
а когда я делаю str.c_str() снаружи, таки копирования не происходит?

А если сделать str.c_str() снаружи, а потом str.c_str() сделать внутри? Вот как думаешь, что случится?
6 май 20, 20:50    [22128511]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
"внутрей" к тому времени уже не будет
оттуда return был
6 май 20, 21:05    [22128523]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
полудух
"внутрей" к тому времени уже не будет
оттуда return был

При большом желании можно и в "нутря" вернуться == std::longjmp.

Московский утверждает, что та переменная типа std::string на самом деле будет создана на стеке функции main() и никакого копирования строки не будет. А раз она создана там, то там и создана. И дальше можно делать хоть в c_str() - да хоть куда.
6 май 20, 21:13    [22128525]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
petrav
полудух
"внутрей" к тому времени уже не будет
оттуда return был

При большом желании можно и в "нутря" вернуться == std::longjmp.

Московский утверждает, что та переменная типа std::string на самом деле будет создана на стеке функции main() и никакого копирования строки не будет. А раз она создана там, то там и создана. И дальше можно делать хоть в c_str() - да хоть куда.

спасибо, кэп, я спрашивал про другое - делает ли c_str() копирование, когда преобразует string в char*?
технически ведь он ничего не преобразует, там внутрях тот же char*...
он его мувает наружу, или указатель вертает, или как?
в коде вроде указатель:
      // String operations:
      /**
       *  @brief  Return const pointer to null-terminated contents.
       *
       *  This is a handle to internal data.  Do not modify or dire things may
       *  happen.
      */
      const _CharT*
      c_str() const _GLIBCXX_NOEXCEPT
      { return _M_data(); }

Return const pointer to null-terminated contents.

Сообщение было отредактировано: 6 май 20, 21:33
6 май 20, 21:30    [22128533]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
полудух

спасибо, кэп, я спрашивал про другое - делает ли c_str() копирование, когда преобразует string в char*?
технически ведь он ничего не преобразует, там внутрях тот же char*...
он его мувает наружу, или указатель вертает, или как?

Короче, дело так обстоит. Код, конечно, прототипный и заведомо неверный. Но концептуально правильный.
struct string
{
    string(): str() {}
    ~string() { delete str; }

    char const *c_str() const { return str; }

    char *str;
}

Никакого копирования не происходит. c_str() это доступ к внутреннему буферу.
6 май 20, 21:43    [22128535]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
полудух,

Точно также как и std::vector::data() и std::array::data() -- просто возвращают указатели на внутренние буферы, больше ничего не происходит.
6 май 20, 21:56    [22128540]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
ясно, спасибо
6 май 20, 22:47    [22128553]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
mayton
petrav
пропущено...

Компилятор? Наверное язык? Но кто-то же должен его анализировать. Продукт очень качественный, мирового уровня и отечественный. Повод для гордости.

Вобщем нечего гордиться. Нет предмета гордости.

Да вот ещё... Вы интересно повернули вопрос о предмете гордости. ООО «Системы программной верификации» российская компания? PVS Studio российская разработка? Я думаю это качественный продукт и повод для гордости, если они из РФ.

А далее Вы приводите разгромную критику языка C++ и компиляторов С++. А ещё далее Вы делаете вывод, что гордится нечем, нет предмета гордости. Ну понятно.

Один вопрос, язык С++ и компиляторы проектировала и разрабатывала тоже ООО «Системы программной верификации» из РФ ?!

Сообщение было отредактировано: 7 май 20, 00:28
7 май 20, 00:28    [22128579]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Да я не про PVS.
7 май 20, 14:57    [22128827]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
PVS-Studio, кстати, даже Джон Кармак (id Software) активно юзает (4:10)
я почитал блог PVS, действительно хорошая штука


Сообщение было отредактировано: 8 май 20, 19:01
8 май 20, 19:02    [22129610]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
В идеале компиллятор должен и выполнять эти функции. А мы должны просто читать внимательно WARNINGs а не игнорить.
8 май 20, 19:24    [22129623]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
похоже такой крутой разбор текста не может сделать таже команда, которая разрабатывает логику компилятора
т.е. тупо с ассемблером работает
нужна отдельная команда
9 май 20, 10:06    [22129797]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6491
mayton
В идеале компиллятор должен и выполнять эти функции.

Вообще-то не должен.
Задача компилятора генерировать код.

Функция анализа кода это задача IDE.
Не говоря уже о том что очень много ложных срабатываний для работы с которыми нужна интерактивность. Т.е. компилятор тут никаким боком.
9 май 20, 13:11    [22129821]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
mayton
Member

Откуда: loopback
Сообщений: 46322
Я просто акцентирую внимание на том что есть тривиальные чеки (типизация и разыменование wild/null)
указателя которую тоже статик-анализатор анализирует но ее-же (эту-же проверку) делает
компиллятор (практически всегда) и пишет варнинги.

Просто мы эти варнинги игнорируем.

Вобщем - толкую о том что не надо с придыханием говорить о статик-анализе. Большая часть проблем
была видна гораздо раньше. Просто в нее не смотрели.
9 май 20, 13:40    [22129831]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
Anatoly Moskovsky
mayton
В идеале компиллятор должен и выполнять эти функции.

Вообще-то не должен.
Задача компилятора генерировать код.

Спорное утверждение. Зачем тогда вообще компилятор выдаёт предупреждения, если можно просто генерировать бинарный код?

Anatoly Moskovsky
Функция анализа кода это задача IDE.

Не согласен. Задача IDE -- это текстовый редактор с поддержкой остальных инструментов: система сборки, взаимодействие с отладчиком, дополнительные аддоны.

Anatoly Moskovsky
Не говоря уже о том что очень много ложных срабатываний для работы с которыми нужна интерактивность. Т.е. компилятор тут никаким боком.

Какие ложные срабатывания? Тут задача тривиального анализа врапперов вокруг printf(). С ней справляется gcc, Студия тоже справляется но... через непотребство.
9 май 20, 14:15    [22129857]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
petrav
Member

Откуда:
Сообщений: 2075
Я немного перепутал топики. Прошу прощения.
9 май 20, 14:27    [22129865]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
mayton
Просто мы эти варнинги игнорируем.

всмысле игнорируем? Я если вижу красненькое, то сразу правлю. Это же лютое распиздяйство - красненькое игнорировать.
9 май 20, 20:14    [22129944]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
Anatoly Moskovsky
полудух,

Все компиляторы оптимизируют это устраняя копирование возвращаемого значения, и по факту функция работает с тем экземпляром куда результат присваивается в вызывающем коде (RVO).
А начиная с С++17 это обязательное поведение.

Так что можете спокойно возвращать строку.

а почему тут сработает?
class db_exception
{
  public:
    string msg;
    const char* m_stage;

    const char* what() const {
        return msg.c_str();
    }

    const char* stage() const {
        return m_stage;
    }
}
12 май 20, 09:52    [22130971]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49957

полудух
а почему тут сработает?

https://en.cppreference.com/w/cpp/language/lifetime

Posted via ActualForum NNTP Server 1.5

12 май 20, 12:24    [22131086]     Ответить | Цитировать Сообщить модератору
 Re: return str.c_str() не пашет  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 1338
что-то многовато там фраз Undefined behavior... куда смотреть то?
объект всё ещё жив, но функция то внутри него оживает только в момент вызова и заканчивается по достижении }
а потом снова оживает новая ф-я в момент вызова
т.е. она не отличается от обычной ф-и в этом плане

Сообщение было отредактировано: 12 май 20, 21:03
12 май 20, 21:02    [22131559]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / C++ Ответить