Форум программистов, компьютерный форум CyberForum.ru

Конструкторы и механизм return - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка в коде http://www.cyberforum.ru/cpp-beginners/thread1138831.html
#include <iostream> #include <vector> using namespace std; void margeSorat(vector<int> &a, size_t start, size_t end) { if (end - start <2) return; if (end - start == 2) {
C++ Шаблонные чистые виртуальные методы Возник вопрос: Есть у нас допустим класс, который мы желаем сделать абстрактным: template <typename T, class = typename std::enable_if<std::is_integral<T>::value>::type> class AbstractIntergal { public: typedef T value_type; value_type value; AbstractIntergal() : value(0) {} AbstractIntergal(value_type src) : value(src) { } http://www.cyberforum.ru/cpp-beginners/thread1138829.html
Конструкция в условии C++
if(a==b==c==5) Такая конструкции будет работать без сбоев? А то компилятор делает предупреждение.
C++ Передача ofstream в функцию
Здравствуйте. Подскажите, пожалуйста, как сделать из участка с 54 по 62 строку отдельную функцию (также с 64 по 73, с 75 по 85, с 87 по 96). Спасибо! using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char word;
C++ Определить номера символов в строках и сравнить их http://www.cyberforum.ru/cpp-beginners/thread1138787.html
Здравствуйте. Помогите, пожалуйста, опыта очень мало. Задача такова: в случаях, когда левая круглая скобка не закрылась в этой же строке, проверить присутствуют ли в исходном тексте не выровненные строки-продолжения, чтобы начаться в позиции символа сразу после левой круглой скобки. Код расположенный в цикле - это мое предположение как должна происходить проверка. char ch; char * pch,...
C++ Високосный год Трабл с кодом, ничего не могу понять. Посмотрите, пожалуйста. Вот, что выдает компилятор Line 7: error: multi-character character constant Line 8: error: multi-character character constant #include <stdio.h> using namespace std; int main() подробнее

Показать сообщение отдельно
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
04.04.2014, 16:13  [ТС]     Конструкторы и механизм return
Вот нашел здесь такое: http://rsdn.org/forum/cpp/1436516.all
А>1.

C++
1
2
3
4
5
6
int f(){
  int y = 5;
  return 5;
}
 
a  = f(); //вот тут вычислится значение f - выделится память на int и после присвоения - освободится

большинство реализаций скомпилируют это так, что f вернёт значение в каком-нибудь предназначенном для этого месте проца, например в специальном регистра. На Intel это обычно eax. оттуда это значение и будет сохранено в переменную a.


А>2.


C++
1
2
3
4
5
const char* f(){
 return "qwe";
}
 
const char *str = f(); // Что вот тут будет? Какая память выделяется и что с ней дальше происходит?

Строчка "qwe" выделится в сегменте статических данных и будет там спокойно жить, когда функция затеет его возвращать, она вернёт просто сам указатель, то есть тоже как атомарное значение, то есть всё будет очень похоже на п 1, только значение будет передаваться другое. Оно же и сохранится в str.
Правда есть одно замечание. В C++ "qwe" имет тип const char [4], так что чтобы всё было по стандарту, нужно писать ещё и выделенное полужирным const

А>3.


C++
1
2
3
4
5
6
char* f(){
 char qw[] = "qwe";
 return qw;
}
 
char *str = f(); // Что вот тут будет? Какая память выделяется и что с ней дальше происходит?

А вот тут будет плохо!

char qw[] = "qwe"; -- это объявление автоматического массива из 4-х char'ов, и инициализация его кодами букв q, w, e и 0.
После чего адрес этого массива (то есть адрес данных на стеке), будет возвращён из функции так же как был возвращён адрес во втором случае. Но, так как стековый фрейм f будет к этому моменту разрушен, то эти данные довольно скоро будет затёрты какими-нибудь другими пользователями стека, так что вы получити какой-то мусор.

Но есть ещё и
4

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct IntData {
   int Size;
   int Data[15];
};
 
IntData f() {
   IntData result;
   //  тут как-то инициализируют поля переменной result
   return result;
}
 
IntData data = f(); // Что вот тут будет? Какая память выделяется и что с ней дальше происходит?

Произойдёт интересно.
Так как структура IntData довольно большая, то она уже скорее всего не сможет быть передана через "волшебное место" в процессоре, так что она будет передаваться через память. Обычно это происходит так:
1) Тот кто вызывает, заводит у себя место под возвращаемое значние функции. Если компилятор не совсем того, то в данном контексте это будет непосредственно место под переменную data.
2) у функции f() на самом деле есть тайный параметр, куда передаётся указатель на это место
3) в операторе return будет вызван конструктор IntData, при этом объект будет сконструирован как раз в том самом месте. В этом варинте функции позовут конструктор копирования.
4) Вызывающая сторона сама решает как распорядиться полученным временным объектом. В жанном варианте (если компилятор не совсем того), то временного объекта вообще не будет и мы просто получим инициализированную переменную data и программа продолжит выполнение.

Сообщение довольно старое. Этому можно верить? Сейчас тоже так все происходит?
 
Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru