Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Если нельзя пользоваться {auto|scoped|shared|..}_ptr(), то можно сделать, например, так.
extern my_class_t func1();
{
my_class_t a;
func1().swap(a);
// use a here
}
Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
extern my_class_t func1();
E>>>>{
E>>>> my_class_t a = func1();
E>>>> // use a here
E>>>>}
F>>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. _>>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок. F>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
тот же, кто сказал, что my_class_t — это вектор на стопицот гигабайт.
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Если объект возвращается по значению, то есть, копия, то ничего
специально делать не нужно — деструктор данного объекта будет вызван при выходе из
области видимости функции.
extern my_class_t func1();
E>>>{
E>>> my_class_t a = func1();
E>>> // use a here
E>>>}
F>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.
_>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.
Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?
Здравствуйте, enji, Вы писали:
E>гм, а зачем навороты со свапом?
E>
extern my_class_t func1();
E>{
E> my_class_t a = func1();
E> // use a here
E>}
Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, tnikolai, Вы писали:
T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new. T>И я хочу чтоб в коде, вызывающем эту функцию, совершенно не надо было бы заботиться об удалении этого буфера.
Здравствуйте, tnikolai, Вы писали:
T>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.
Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
зачем вообще возвращать указатель на нечто что потом еще придется удалять
вручную лучше создать это нечто выше в стеке пусть оно само себя удаляет
передать ссылку на это нечто куда нужно ниже для заполнения
Здравствуйте, sidorov18, Вы писали:
S>Ну да. Оптимизатор должен с этим справится. S>Пример http://ideone.com/b79B3
Ну, в смысле, что если функция по значению возвращает, то сохранять это значение в ссылку, а не в копию никогда не выгодно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Из функции должны возвращаться данные в виде класса.
Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Здравствуйте, frogkiller, Вы писали:
F>Здравствуйте, tnikolai, Вы писали:
T>>Из функции должны возвращаться данные в виде класса. T>>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
F>Если нельзя пользоваться {auto|scoped|shared|..}_ptr(), то можно сделать, например, так.
F>
extern my_class_t func1();
F>{
F> my_class_t a;
F> func1().swap(a);
F> // use a here
F>}
F>Функцию swap() тебе в качестве домашнего задания предлагается сделать самому.
гм, а зачем навороты со свапом?
extern my_class_t func1();
{
my_class_t a = func1();
// use a here
}
T>>Из функции должны возвращаться данные в виде класса. T>>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся. ZS>Разберитесь в терминах!!! Класс никак нельзя удалить по определению!!! Поэтому не совсем понятно что именно Вам нужно. Можно пример кода?
Объект класса.
Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new.
И я хочу чтоб в коде, вызывающем эту функцию, совершенно не надо было бы заботиться об удалении этого буфера.
extern my_class_t func1();
E>>{
E>> my_class_t a = func1();
E>> // use a here
E>>}
F>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп.
благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок.
Здравствуйте, const_volatile, Вы писали:
F>>>>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. _>>>благодаря семантике move-конструкторов, не начинает. курим c++0x на предмет rvalue-ссылок. F>>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
_>тот же, кто сказал, что my_class_t — это вектор на стопицот гигабайт.
Ну, и я был недалеко от истины, тут топикстартер написал уже про массив данных.
И потом, правда же, что при сеансе телепатии лучше закладываться на более тяжелые условия. Вдруг ему нужно писать под MSVC6.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, frogkiller, Вы писали:
F>Прикинь, если my_class_t — это вектор, а func1() в него запихнула парочку гигабайт данных. И у тебя оно дружно начинает копироваться, загоняя комп в своп. В условии же не говорится, какие именно данные будут.
ИМХО, тяжелые объекты лучше из функций не возвращать, а передавать в функцию по ссылке объект для заполнения. Все таки постоянно писать swap как-то напряжно, легко где-то забыть...
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса.
возвращается объект... T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
при выходе из области видимости все локальные переменные созданные в стеке удаляются автоматически(соот-но компилятор сам добавляет код, который вызывает все нужные деструкторы). При возврате объекта по значению компилятор создает временный объект(адрес которого помещается как скрытый аргумент функции перед вызовом функции в стеке) с помощью копирующего конструктора и удаляет этот объект после завершения выполнения выражения, в котором вызывается данная функция.
Динамически созданные объекты возвращаются по указателю... Тогда надо явно вызывать delete или delete[](для массивов) когда возвращенный объект больше не нужен.
extern my_class_t func1();
F>{
F> my_class_t a;
F> func1().swap(a);
F> // use a here
F>}
Открой для себя RVO/NRVO
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, frogkiller, Вы писали:
F>Кто сказал, что его компилятор поддерживает 0х? Кто сказал, что тут всегда будет работать RVO/NRVO?
1) Потому, что работать ему проще, чем не работать...
2) Сама идея возвращать что-то тяжёлое по значению, а не отдавать буфер для заполнения -- спорная.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, wvoquine, Вы писали:
T>>Вообще мне из функция просто надо возвратить указатель на буффер с данными, память под который была выделена с помощью new. W>Если это указатель на объект класса, то для этой цели хорошо подойдёт auto_ptr
На объект, но не на вектор объектов!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Я так понял, что тебе надо вернуть массив объектов? Да?
Ну так сделай прямо и не страдай.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, tnikolai, Вы писали:
T>Из функции должны возвращаться данные в виде класса. T>Как сделать так, чтоб в коде, при выходе из области видимости блока, в котором вызывается эта функция, возвращенный класс автоматически удалялся.
Если хочется в одну строчку получать объекты, самое простое решение:
std::auto_ptr
Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.
Здравствуйте, sidorov18, Вы писали:
S>Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.
Зачем по ссылке? Можно и по значению...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Только, если ты придерживаешься true stl way, то делать принято не так, как-то так примерно:
template<typename TIter>
TIter foo( TIter toInsert )
{
// тут какой-то код, цикл какой-то и т. д.
*toInsert++ = currentElement;
// дальше кодreturn toInsert;
}
void bar()
{
std::vector<MyData> data;
foo( back_inserter( data ) );
}
Ну и понятно, что внутри функции TIter foo( TIter toInsert ), тоже стараются не явно
*toInsert++ =
написать, а использовать какой-нибудь алгоритм, например из хедера algorithm...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, sidorov18, Вы писали:
S>>Ну а если в функции все просто, то можно смело принимать объект по константной ссылке, RVO/NRVO сделают свое дело.
E>Зачем по ссылке? Можно и по значению...