LINUX.ORG.RU

Рассудите уж

 ,


0

4

Есть такой код:

#include <stdio.h>
#include <string.h>

typedef struct {
	char text[256];
	int type;
} Token;

Token tok_get() {
	Token t_tok;
	printf("Pointer in function tok_get %x\n", &t_tok);
	return t_tok;
}

int main(void) {
	Token t_main;
	printf("Pointer in function main %x\n", &t_main);
	t_main = tok_get();
	printf("Pointer after assign %x\n", &t_main);
	return 0;
}
Я привожу его как пример того, что все 260 байт возвращаемые из функции будут СКОПИРОВАНЫ в переменную t_main. Товарищ Lincor говорит, что это не верно.

П.С. Давайте вариант без оптимизаций рассмотрим.

Deleted

Последнее исправление: Bizun (всего исправлений: 2)
Ответ на: комментарий от crowbar

return value optimization может и так вернуть.

Давайте вариант без оптимизаций рассмотрим.

Deleted
()

Копирование может и произойти, и нет, рассчитывать на какое-либо определённое поведение не стоит.

PolarFox ★★★★★
()

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

crowbar
()
Ответ на: комментарий от Lincor

вот! я то же самое говорил! может произойти, а может быть pop сразу в переменную.

Без оптимизаций всегда копируется.

Deleted
()
Ответ на: комментарий от Lincor

Как из этого сраного ВК вытянуть лог?

Deleted
()
Ответ на: комментарий от Deleted

это не имеет отношения к оптимизации. оба способа одинаково трудоемки для компилятора. а может, второй даже проще.

Lincor
()
Ответ на: комментарий от Deleted

Посмотри на пример из педивикии (понимаю, что это с++, но так нагляднее) и попробуй его скомпилировать и запустить:

#include <iostream>

struct C {
   C() {}
   C(const C&) { std::cout << "A copy was made.\n"; }
};

C f() {
    return C();
}

int main() {
    std::cout << "Hello World!\n";
    C obj = f();
}
Waterlaz ★★★★★
()
Ответ на: комментарий от Lincor

это не имеет отношения к оптимизации. оба способа одинаково трудоемки для компилятора. а может, второй даже проще.

Ок. Как прикажешь работать со стеком, когда там остался мусор от другой функции?

Ребята, разупоритесь.

Deleted
()

если ansiC(и позжее - без оптимизаций - механика может быть любой, но семантика копирования по значению для struct обязательна)то по значению при выполнении функции будет отведено место для ретвэлью, затем место всем локальным, затем по выходу из . ретвэлью будет скопированно в t_main

qulinxao ★★☆
()
Ответ на: комментарий от Deleted

Я не знаю с++. Здесь речь идет только о Си.

Ну хоть базовое представление о С++ ты иметь должен

Waterlaz ★★★★★
()

А вообще, я даже не думал, что это будет работать. Но сработало:

cat 1.c 
#include <stdio.h>
#include <string.h>

typedef struct{
	char text[256];
	int type;
} Token;

Token tok_get(){
	Token t_tok;
	printf("Pointer in function tok_get %zd\n", (size_t)&t_tok);
	memset(t_tok.text, 'Ъ',255);
	return t_tok;
}

int main(void){
	Token t_main;
	printf("Pointer in function main %zd\n", (size_t)&t_main);
	t_main = tok_get();
	printf("Pointer after assign %zd\n", (size_t)&t_main);
	printf("t_main.text = %s\n", t_main.text);
	return 0;
}
gcc 1.c -o main && ./main
Pointer in function main 140734312254784
Pointer in function tok_get 140734312254224
Pointer after assign 140734312254784
t_main.text = ЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪЪ
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Lincor

Распарсил. Все верно. Выделили память, скопировали в переменную, все затерли. Стек чистый. ЧТД.

Deleted
()
Ответ на: комментарий от Lincor

Майк, ПОСЛЕ копирования стек будет чистым. Ни на какой фрагмент в памяти переменная в main указывать не будет!

А чисткой стека в сишке занимается функция из которой была вызвана дочерняя функция, если ты про это.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Ты нормальный вообще? ТРЕД О ТОМ, КАК КОМПИЛЯТОР ПЕРЕДАЕТ ЗНАЧЕНИЕ ЗДРРОВЕННОЙ СТРУКТУРЫ ИЗ ФУНКЦИИ! НЕ О ТОМ, КАК ЛУЧШЕ СДЕЛАТЬ, А О ТОМ, КАК КОМПИЛЯТОР ПЕРЕДАЕТ ЗНАЧЕНИЕ ЗДОРОВЕННОЙ СТРУКТУРЫ ИЗ ФУНКЦИИ?

Едик, не тупи.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)

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

Deleted
()
Ответ на: комментарий от Deleted

И на кой хрен было доказывать, что можно взять гвоздемет и прихерячить яйца к мостовой? Можно, ясен пень.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

Как вы задолбали. Я пол треда объяснял эдику, одну простую вещь... Вот прочитай тред м пойми, что твой пост здесь на хрен не нужен.

Deleted
()
Ответ на: комментарий от arturpub

А что, ваш хрюникод так не умеет, да? Гыгыгы!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Deleted

сохранить она его может сразу в переменную, которой присваивается возвращаемое значение. никакого копирования.

Lincor
()
Ответ на: комментарий от Eddy_Em

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

Deleted
()
Ответ на: комментарий от Deleted

Зачем так орать, царя разбудишь. Легкое гугление выдает инфу, что даже внутри cdecl есть разные трактовки/мнения как надо, поэтому фактически отличается поведение не только платформ, но и компиляторов на них. Разумно предположить, что в сферическом оптимизирующем компиляторе в вакууме и мелкие, и крупные могут копироваться, в зависимости от наличия юзкейсов, препятствующих оптимизациям.

arturpub ★★
()
Ответ на: комментарий от Lincor

Значение из фрагмента в стеке будет скопировано в переменную.

Как здесь не может быть копирования?

Deleted
()
Ответ на: комментарий от Lincor

А, ты хотел сказать, что в фрагмент (кадр) стека значение ложится не будет, а будет копироватся сразу в переменную main?

Это оптимизация.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Lincor

И вообще, как прикажешь адресовать переменную в main в таком случае? Она же находится в другом кадре стека, там SP и BP разные.

Deleted
()
Последнее исправление: Bizun (всего исправлений: 1)
Ответ на: комментарий от Deleted

это само собой. но значение на стеке уничтожается. на нашей ВМ pop может сначала убирать значение со стека (сохранять его в памяти хоста), а потом копировать в память ВМ. в итоге получаем не копирование, а перемещение и не теряем памяти. блин, идея - супер, надо запилить!

Lincor
()
Ответ на: комментарий от Deleted

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

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.