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)
Ответ на: комментарий от arturpub

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

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

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

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

Это приведет к сегфолту. Я говорил ему, надо сначала гвозди из мошонки достать, а потом идти.

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

Не приведет к сегфолту. Ведро уже дырявое, если яйца к мостовой прибиваешь...

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

Дядя, это ты упорот, таки яйца к мостовой гвоздями не я прибиваю! И не я МПХ потом безнопилой отрезаю

Eddy_Em ☆☆☆☆☆
()

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

что за компилятор умеет без оптимизаций? это особый компилятор для ССЗБ?

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

таки я забыл, что память после pop мы не обнуляем, а просто инкременентируем SP. да и храним мы значение со стека в переменных на хосте. а еще наш pop работает только с регистрами. надо переделать.
и таки да, при pop мы не теряем памяти ВМ. только на хосте, и то временно.

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

это компилятор ТС, который будет компилировать себя под аппаратную платформу ТС (ну, и не только ТС).

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

Ты первый начал проводить аналогии. Я подхватил инициативу т.к. ты не понимаешь русского языка.

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

в RISC стека нет, ты говорил. а еще ты говорил - и я с тобой согласен - что у нас не Ъ-RISC. самое разумное - гибридность. у CISC много преимуществ.
а как иначе прикажешь снимать значение после pushv? хотя можно циклом делать pop в регистр... но в результате будет снято лишнее слово, и его придется класть обратно. в общем, аццтой.

Lincor
()

Token tok_get()

Чёж воид не пишешь?

Token

Что за ублюдочное название?

%x\n

Что за днище? Где %p?

СКОПИРОВАНЫ

Да, структура копируется в сишке полностью. Так же и в функцию/из функции.

Товарищ Lincor говорит, что это не верно.

Плюнь ему в рожу.

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

Кому это нужно? Ну давай.

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

Ужас какой! Ты копируешь структуры... буэээээ!

Если ты нулёвый - это не значит, что мир обрамлён твоим нулёвым представлением.

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

anonymous
()

В вашем вопросе 2 вопроса.

1. будетли код правильно работать

Да, будет, пофиг оптимизации

2. можетли компилятор оптимизировать memcpy в таком случае

в принципе может, g++ справляется

imatveev13
()

Очередной парад дебилов

ЛОРовские недоумки в своём репертуаре. ДА, копирование структуры по значению — это совершенно штатное, предусмотренное стандартом, поведение. НЕТ, она не обязательно будет передаваться на стеке, про это как раз в стандарте ничего не сказано. Небольшие (насколько — зависит от платформы) структуры спокойно передаются на регистрах.

alegz ★★★★
()

оставлю это тут:

[regular-user@localhost Desktop]$ cat x.cpp 
#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 %lx\n", &t_tok);
	return t_tok;
}

int main(void) {
	//Token t_main;
	//printf("Pointer in function main %lx\n", &t_main);
	//t_main = tok_get();
	Token t_main = tok_get(); // теперь попробуем вот так
	
	printf("Pointer after assign %lx\n", &t_main);
	return 0;
}

[regular-user@localhost Desktop]$ gcc -o x x.cpp # ни какой оптимизации

[regular-user@localhost Desktop]$ ./x

Pointer in function tok_get 7fff78ffbd70
Pointer after assign 7fff78ffbd70



[regular-user@localhost Desktop]$ mv -v x.cpp x.c
‘x.cpp’ -> ‘x.c’

[regular-user@localhost Desktop]$ gcc -o x x.c

[regular-user@localhost Desktop]$ ./x
Pointer in function tok_get 7fff87c71ad0
Pointer after assign 7fff87c71bf0
user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от Sorcerer

Гы, не дочитал ман до конца. Я просто никогда не занимался таким тупым делом, как вывод значения указателя на печать.

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

Честно, фигней какой-то занимаешься...

Это тебе так кажется.

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

Кажется Мастер отметился выше по треду.

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

Т.е. во втором случае, оптимизация таки была?

нет. всё то же самое, но только лишь с той разницей что файл «x.cpp» переименовали в файл «x.c» :)

вобщем, намёк на то что в C и в C++ по разному этот момент трактуется, в реализации компилятора GCC :-)

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

copy elision, насколько мне известно, существует только в C++...

Iron_Bug

intelfx ★★★★★
()

топикстартеру

В C++ (как в Си — не знаю, скастовал вот человека) есть такая вещь, как copy elision: лишние копирования и перемещения могут быть опущены.

Эта оптимизация явно описана в стандарте (но не как требуемая). Более того, ей разрешено менять поведение программы. То есть, нельзя полагаться на то, что твой конструктор копирования или перемещения обязательно сработает. Компилятор имеет право оптимизировать так, что он не вызовется (хотя должен был бы) — кстати, crowbar.

Но если потребовать отключения вообще всех оптимизаций (не знаю, может ли так gcc) — то, естественно, структурка скопируется.

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

никакой rvo здесь не будет, потомушто:

	Token t_main;
	printf("Pointer in function main %x\n", &t_main);
	t_main = tok_get();

для rvo нужно:

	Token t_main = tok_get();

rupert ★★★★★
()
Ответ на: Очередной парад дебилов от alegz

ЛОРовские недоумки в своём репертуаре.

+ много

Перепись дебилов, не способных прочитать спеку, успешно проведена.

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