Старый 09.09.2011, 11:50   #391   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Кто-нибудь знает почему в cpp не принято передавать в функцию встроенные типы по ссылке, а передают их по значению? например, func(int) а не func(const int &) ?
  Ответить с цитированием
Старый 09.09.2011, 12:03   #392   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Кто-нибудь знает почему в cpp не принято передавать в функцию встроенные типы по ссылке, а передают их по значению? например, func(int) а не func(const int &) ?
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
  Ответить с цитированием
Старый 09.09.2011, 13:46   #393   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
что за адрес? на чем основано это утверждение?
ссылка - не указатель, это псевдоним, его реализация на совести компилятора. накладные расходы возникнут при копировании по значению, а вот при передаче по ссылке не все так ясно, их может вообще не быть.
  Ответить с цитированием
Старый 09.09.2011, 14:23   #394   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
что за адрес? на чем основано это утверждение?
Адрес памяти. На том что имею привычку смотреть на сгенерированный ассемблерный код при отладке))

Цитата:
Сообщение от manifest Посмотреть сообщение
ссылка - не указатель, это псевдоним
понятие псевдоним процессору неизвестно)))

Цитата:
Сообщение от manifest Посмотреть сообщение
, его реализация на совести компилятора.
Передача переменной по ссылке - это прямое указание компилятору процессору (вот ведь ступил) передать адрес, а не значение.

Цитата:
Сообщение от manifest Посмотреть сообщение
накладные расходы возникнут при копировании по значению, а вот при передаче по ссылке не все так ясно, их может вообще не быть.
при передаче по ссылке все ясно, будет передана ссылка, как бы странно это не звучало)) Вернее - адрес переменной)

Последний раз редактировалось Spectator; 10.09.2011 в 00:04.
  Ответить с цитированием
Старый 09.09.2011, 14:58   #395   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Существует ли sdk для работы с линейкой продуктов 1С 8.x или описание серверного протокола 1С 8.x (про COM знаю, этот вариант не подходит)?
  Ответить с цитированием
Старый 09.09.2011, 15:21   #396   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Существует ли sdk для работы с линейкой продуктов 1С 8.x или описание серверного протокола 1С 8.x (про COM знаю, этот вариант не подходит)?
Ну вот есть такая хрень, правда для .NET
http://www.realcoding.net/downloads/...ersiya-17.html
Протокол 1С наверняка закрыт, да и не самая лучшая это идея, его использовать.
  Ответить с цитированием
Старый 09.09.2011, 15:35   #397   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Spectator,
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
(про COM знаю, этот вариант не подходит)
Цитата:
Сообщение от http://www.realcoding.net/downloads/enterra-net-sdk-dlya-1s-versiya-17.html
Подключение к информационной базе 1С:Предприятие осуществляется посредством технологии COM.
Цитата:
Сообщение от Spectator Посмотреть сообщение
да и не самая лучшая это идея, его использовать.
Причина? Хотя, я, конечно, понимаю, все подводные камни реверс-инжиниринга протокола, и откажусь от идеи, если 1С не предоставляет соответствующих средств, в пользу sync сервиса на машине с 1С.
  Ответить с цитированием
Старый 09.09.2011, 15:38   #398   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
понятие псевдоним процессору неизвестно)))
понятие псевдоним знакомо компилятору, который будет создавать код для процессора, у него есть возожность его оптимизировать

Цитата:
Сообщение от Spectator Посмотреть сообщение
Передача переменной по ссылке - это прямое указание процессору передать адрес, а не значение.
Цитата:
Сообщение от Spectator Посмотреть сообщение
при передаче по ссылке все ясно, будет передана ссылка, как бы странно это не звучало)) Вернее - адрес переменной)
В случае с встроеными типами, код с аргументами ф-ции передаваемыми по значению был бы всегда эффективней кода с передачей ссылок, но это не так
  Ответить с цитированием
Старый 09.09.2011, 15:41   #399   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
если бы это было так, код с аргументами ф-ции передаваемыми по значению был бы всегда эффективней кода с передачей ссылок
Либо я чего-то не понял в фразе, либо тут логическая ошибка. Почему вы так решили? при передаче по значению происходит копирование. Передача по ссылке всегда эффективнее, но и накладывает ограничения на использование переменной.
  Ответить с цитированием
Старый 09.09.2011, 15:46   #400   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Причина? Хотя, я, конечно, понимаю, все подводные камни реверс-инжиниринга протокола, и откажусь от идеи, если 1С не предоставляет соответствующих средств, в пользу sync сервиса на машине с 1С.
Все что официально не открыто производителем официально не поддерживается. Т.е. при смене версии 1С вполне возможно все придется переделывать.
В WinAPI есть тоже довольно интересные недокументированные функции, которых нет в MSDN, но Microsoft их не особо скрывает. НО - никто не гарантирует что эти функции будут существовать в следующей версии Windows.

А в чем поблема с COM? Почему она (технология) не подходит?
  Ответить с цитированием
Старый 09.09.2011, 15:51   #401   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
А в чем поблема с COM? Почему она (технология) не подходит?
Потому что отдельный не windows сервер.
  Ответить с цитированием
Старый 09.09.2011, 15:56   #402   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Потому что отдельный не windows сервер.
А сразу в базу не хочешь залезть?, минуя вообще 1С, 8-ка же работает через SQL, насколько мне известно.
  Ответить с цитированием
Старый 09.09.2011, 16:06   #403   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Цитата:
Сообщение от Spectator Посмотреть сообщение
А сразу в базу не хочешь залезть?, минуя вообще 1С, 8-ка же работает через SQL, насколько мне известно.
С базой есть некоторые проблемы, которые связаны, во-первых, с именованием столбцов и таблиц, во-вторых, все таки это прямой доступ к данным (а мне и писать таки надо), в-третьих, могут понадобиться еще и всяческие отчеты и т.п. хлам, который, как я понял генерируется не процедурами в БД, и, наконец, это нарушает лицензию.
  Ответить с цитированием
Старый 09.09.2011, 16:39   #404   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Либо я чего-то не понял в фразе, либо тут логическая ошибка. Почему вы так решили? при передаче по значению происходит копирование. Передача по ссылке всегда эффективнее, но и накладывает ограничения на использование переменной.
Цитата:
Сообщение от Spectator Посмотреть сообщение
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
Моя фраза - ответ на утверждение Spectator о том что при передаче аргумента по ссылке, фактически копируется указатель, а эта операция менее эфективна чем копирование значения переменной встроеного типа.

По моему мнению, не все так тривиально, компилятор может сформировать машинный код, который будет оперировать указателем на переменную, а может и нет. И в большинстве случаев, код с передачей по ссылке будет эффективнее. И в этом случае, встает изначальный вопрос. Зачем копировать по значению?

О каких ограничениях вы говорите?
  Ответить с цитированием
Старый 09.09.2011, 16:49   #405   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Зачем копировать по значению?
Что бы потом не пришлось делать копирование значения внутри функции.
Цитата:
Сообщение от manifest Посмотреть сообщение
О каких ограничениях вы говорите?
Изменение значения переменной, переданной по ссылке, может приводить к негативным последствиям, потому что распространяется за пределы данной функции.
  Ответить с цитированием
Старый 09.09.2011, 18:01   #406   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Что бы потом не пришлось делать копирование значения внутри функции.
это вопрос стиля программирования, эффективность операции передачи аргумента по ссылке и затем его копирование, насколько я могу судить, аналогично передаче аргумента по значению. поэтому эта ситуация не интересна

Цитата:
Сообщение от Shtirliz Посмотреть сообщение
Изменение значения переменной, переданной по ссылке, может приводить к негативным последствиям, потому что распространяется за пределы данной функции.
это не ограничение, в приведенном примере, передавать следует по ссылке на константный объект, это условие не позволит изменять объект в теле ф-ции.
  Ответить с цитированием
Старый 09.09.2011, 18:11   #407   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
это не ограничение, в приведенном примере
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается.
  Ответить с цитированием
Старый 09.09.2011, 19:11   #408   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается.
откуда такое заключение и при чем тут размер указателя?

Для моей платформы размер int`а меньше чем указатель на него:
sizeof(int) // 4
sizeof(int *) // 8
sizeof(int &) // 4 (размер чего такой вызов возвращает не знаю )

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

Код:
int test1(int x) {
	return x;
}

int test2(const int &x) {
	return x;
}

const int &test3(const int &x) {
	return x;
}

int main() {
	int x = 1;
	for(size_t i=0 ; i<0xFFFFFFF; ++i)
   		//testN(x);
}

//// empty loop
real	0m0.721s
user	0m0.713s
sys	0m0.002s

//// test1
real    0m1.325s
user    0m1.320s
sys     0m0.002s

//// test2
real    0m1.242s
user    0m1.239s
sys     0m0.002s

//// test3
real    0m1.075s
user    0m1.072s
sys     0m0.002s
вывод утилиты time (время выполнения бинарника)
  Ответить с цитированием
Старый 09.09.2011, 20:36   #409   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается.
Ты несколько неправ. Что байт что int что ссылка передаются в одном регистре процессора. Соответственно всё что больше размерности регистра (32 или 64 в случае процессоров с 64 битными регистрами) выгодно передавать по ссылке. а что меньше - по значению. Более того - создавать байтовые переменные не рекомендуется, максимальная скорость будет достигнута если использовать тип int, даже если реально хватило бы и байта. а размер int всегда равен размерности регистра процессора целевой платформы.
  Ответить с цитированием
Старый 09.09.2011, 20:53   #410   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
откуда такое заключение и при чем тут размер указателя?

Для моей платформы размер int`а меньше чем указатель на него:
чем компилишь и какая целевая платформа (ну, целевой процессор, лень вспоминать точное определение)? Не должно быть так, вроде. Проверить не могу, так как у меня 32битный процессор, я просто не запущу программу.

Upd: я неправ, надо указывать явно. Неправ по поводу "а размер int всегда равен размерности регистра процессора целевой платформы." , http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Всё остальное описанное в предыдущем посте остается в силе.
  Ответить с цитированием
Старый 09.09.2011, 21:24   #411   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Немного поменял название с условием реально происходящего в теме.
  Ответить с цитированием
Старый 09.09.2011, 22:17   #412   
Форумец
 
Аватар для Shtirliz
 
Сообщений: 248
Регистрация: 17.01.2005

Shtirliz вне форума Не в сети
Да, согласен, меньше указателя не будет. Туплю, пятница.
А насчет теста, вы уверены в том, что компилятора не выкинул цикл как пустой? Тут кк раз ассемблерный листинг надо приводить.
  Ответить с цитированием
Старый 09.09.2011, 22:39   #413   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Shtirliz Посмотреть сообщение
А насчет теста, вы уверены в том, что компилятора не выкинул цикл как пустой? Тут кк раз ассемблерный листинг надо приводить.
Здесь крайне согласен, по поводу ассемблерного листинга, или - хотя бы выключить всю оптимизацию.
Хотя тут зависит от компилятора, если компилятор Borland/Inpise с выключенной оптимизацией честно будет тупо все транслировать в машинные коды построчно, то Visual C++ крайне своенравный и в Release билде частенько плюет на опции и директивы, вполне, к примеру, может заинлайнить функцию, даже если дашь указание не инлайнить вообще ничего. Или - наоборот, но это уже документировано, указания инлайна нет, есть только предложение компилятору по воооозможности заинлайнить.
Так что в ассемблерный код в критичных функциях заглядывать надо обязательно.
  Ответить с цитированием
Старый 10.09.2011, 09:00   #414   
Конкистадор
 
Аватар для Мистер
 
Сообщений: 27,960
Регистрация: 27.08.2008
Возраст: 40
Записей в дневнике: 5

Мистер вне форума Не в сети
Где у вас тут можно узнать про 1С Бухгалтерию?
  Ответить с цитированием
Старый 10.09.2011, 12:00   #415   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Мистер Посмотреть сообщение
Где у вас тут можно узнать про 1С Бухгалтерию?
Для начала здесь и спрашивай. На основе ответа отошлем))) куда надо. А может и даже я что посоветую, хотя и не специалист в этом вопросе. Sandy иногда сюда заглядывает вроде, он шарит.
Я планирую создать подраздел для 1Сников, но это надо с Антоном связываться и пока не совсем понятно - нужно ли это, или нет. Не так уж много и тем, связанных с 1С.
Хотя, сделаю так - в течении дня создам просто тему, в которую свалю всё что связано с 1С, и сделаю ее важной. Вот там и задашь, если не горит.

UPDATE: http://bvf.ru/forum/showthread.php?t=803034

Последний раз редактировалось Spectator; 10.09.2011 в 12:28.
  Ответить с цитированием
Старый 10.09.2011, 13:46   #416   
Форумец
 
Аватар для manifest
 
Сообщений: 231
Регистрация: 26.02.2007

manifest вне форума Не в сети
Вооружился дизассемблером и профайлером

osx 10.6 x64
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)

Код:
struct A {
	A() :val_(0) {
	}

    int byValue() const {
        return val_;
    }
    
    const int &byReference() const {
        return val_;
    }

    const int *const byPointer() const {
        return &val_;
    }
    
    void setByValue(int val) {
        val_ = val;
    }
    
    void setByReference(const int &val) {
        val_ = val;
    }
    
    void setByPointer(const int *const val) {
        val_ = *val;
    }

    int val_;
};

int main() {
 	int x = 1;
 	A a;

    int val = a.byValue();
    const int &ref = a.byReference();
    const int *const ptr = a.byPointer();

    a.setByValue(x);
    a.setByReference(x);
    a.setByPointer(&x);
}

/// main
0x0000000100000a28  <+0000>  push   %rbp
0x0000000100000a29  <+0001>  mov    %rsp,%rbp
0x0000000100000a2c  <+0004>  sub    $0x30,%rsp
0x0000000100000a30  <+0008>  movl   $0x1fffffff,-0x4(%rbp)
0x0000000100000a37  <+0015>  movl   $0x1,-0x8(%rbp)
0x0000000100000a3e  <+0022>  lea    -0x10(%rbp),%rdi
0x0000000100000a42  <+0026>  callq  0x100000bc2 <_ZNK1A7byValueEv>
0x0000000100000a47  <+0031>  mov    %eax,-0x14(%rbp)
0x0000000100000a4a  <+0034>  lea    -0x10(%rbp),%rdi
0x0000000100000a4e  <+0038>  callq  0x100000bd2 <_ZNK1A11byReferenceEv>
0x0000000100000a53  <+0043>  mov    %rax,-0x20(%rbp)
0x0000000100000a57  <+0047>  lea    -0x10(%rbp),%rdi
0x0000000100000a5b  <+0051>  callq  0x100000be0 <_ZNK1A9byPointerEv>
0x0000000100000a60  <+0056>  mov    %rax,-0x28(%rbp)
0x0000000100000a64  <+0060>  mov    -0x8(%rbp),%esi
0x0000000100000a67  <+0063>  lea    -0x10(%rbp),%rdi
0x0000000100000a6b  <+0067>  callq  0x100000bee <_ZN1A10setByValueEi>
0x0000000100000a70  <+0072>  lea    -0x8(%rbp),%rsi
0x0000000100000a74  <+0076>  lea    -0x10(%rbp),%rdi
0x0000000100000a78  <+0080>  callq  0x100000c04 <_ZN1A14setByReferenceERKi>
0x0000000100000a7d  <+0085>  lea    -0x8(%rbp),%rsi
0x0000000100000a81  <+0089>  lea    -0x10(%rbp),%rdi
0x0000000100000a85  <+0093>  callq  0x100000c1e <_ZN1A12setByPointerEPi>
0x0000000100000a8a  <+0098>  mov    $0x0,%eax
0x0000000100000a8f  <+0103>  leaveq 
0x0000000100000a90  <+0104>  retq


//byValue
0x0000000100000bc2  <+0000>  push   %rbp
0x0000000100000bc3  <+0001>  mov    %rsp,%rbp
0x0000000100000bc6  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000bca  <+0008>  mov    -0x8(%rbp),%rax
0x0000000100000bce  <+0012>  mov    (%rax),%eax
0x0000000100000bd0  <+0014>  leaveq 
0x0000000100000bd1  <+0015>  retq

//byReference
0x0000000100000bd2  <+0000>  push   %rbp
0x0000000100000bd3  <+0001>  mov    %rsp,%rbp
0x0000000100000bd6  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000bda  <+0008>  mov    -0x8(%rbp),%rax
0x0000000100000bde  <+0012>  leaveq 
0x0000000100000bdf  <+0013>  retq

//byPointer
0x0000000100000be0  <+0000>  push   %rbp
0x0000000100000be1  <+0001>  mov    %rsp,%rbp
0x0000000100000be4  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000be8  <+0008>  mov    -0x8(%rbp),%rax
0x0000000100000bec  <+0012>  leaveq 
0x0000000100000bed  <+0013>  retq

//setByValue
0x0000000100000bee  <+0000>  push   %rbp
0x0000000100000bef  <+0001>  mov    %rsp,%rbp
0x0000000100000bf2  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000bf6  <+0008>  mov    %esi,-0xc(%rbp)
0x0000000100000bf9  <+0011>  mov    -0x8(%rbp),%rdx
0x0000000100000bfd  <+0015>  mov    -0xc(%rbp),%eax
0x0000000100000c00  <+0018>  mov    %eax,(%rdx)
0x0000000100000c02  <+0020>  leaveq 
0x0000000100000c03  <+0021>  retq

//setByReference
0x0000000100000c04  <+0000>  push   %rbp
0x0000000100000c05  <+0001>  mov    %rsp,%rbp
0x0000000100000c08  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000c0c  <+0008>  mov    %rsi,-0x10(%rbp)
0x0000000100000c10  <+0012>  mov    -0x10(%rbp),%rax
0x0000000100000c14  <+0016>  mov    (%rax),%edx
0x0000000100000c16  <+0018>  mov    -0x8(%rbp),%rax
0x0000000100000c1a  <+0022>  mov    %edx,(%rax)
0x0000000100000c1c  <+0024>  leaveq 
0x0000000100000c1d  <+0025>  retq

//setByPointer
0x0000000100000c1e  <+0000>  push   %rbp
0x0000000100000c1f  <+0001>  mov    %rsp,%rbp
0x0000000100000c22  <+0004>  mov    %rdi,-0x8(%rbp)
0x0000000100000c26  <+0008>  mov    %rsi,-0x10(%rbp)
0x0000000100000c2a  <+0012>  mov    -0x10(%rbp),%rax
0x0000000100000c2e  <+0016>  mov    (%rax),%edx
0x0000000100000c30  <+0018>  mov    -0x8(%rbp),%rax
0x0000000100000c34  <+0022>  mov    %edx,(%rax)
0x0000000100000c36  <+0024>  leaveq 
0x0000000100000c37  <+0025>  retq

Если разрешить компилятору оптимизировать, будет сформирован аналогичный код, как для случая передачи по значению, так и для передачи по ссылке:

Код:
//// by reference
int main() {
    A a;
    
    a.setByReference(3);
    const int &ref = a.byReference();

    std::cout<<ref<<std::endl;
}

//// by value
int main() {
    A a;
    
    a.setByValue(3);
    int val = a.byValue();
    
    std::cout<<val<<std::endl;
}

0x0000000100000d91  <+0000>  push   %rbp
0x0000000100000d92  <+0001>  mov    %rsp,%rbp
0x0000000100000d95  <+0004>  mov    $0x3,%esi
0x0000000100000d9a  <+0009>  mov    0x297(%rip),%rdi        # 0x100001038
0x0000000100000da1  <+0016>  callq  0x100000dfa <dyld_stub__ZNSolsEi>
0x0000000100000da6  <+0021>  mov    %rax,%rdi
0x0000000100000da9  <+0000>  callq  0x100000e0c <dyld_stub__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_>
0x0000000100000dae  <+0029>  xor    %eax,%eax
0x0000000100000db0  <+0031>  leaveq 
0x0000000100000db1  <+0032>  retq
Выводы по результатам для приведенного примера без оптимизации, следующие:
1) для указателей и ссылок компилятор сформировал аналогичный код
2) при возврате переменной из ф-ции, по значению сформирована дополнительная иструкция, по ссылке (указателю) - нет
3) при передаче переменной в ф-цию, по ссылке (указателю) сформирована дополнительная иструкция, по значению - нет
4) по результатам профилирования, время выполнения ф-ции setByValue() во всех проведенных тестах меньше времени выполнения setByReference() и setByPointer()
5) по результатам профилирования, время выполнения ф-ций byValue(), byReference() и byPointer() от теста к тесту изменялось, по всем тестам среднее значение одинаково для каждой из ф-ций

Вывод: эффективность кода с передачей переменной встроеного типа по значению и по ссылке одинакова (для оптимизированного компилятором кода, который и будет используется в реальных приложениях), поэтому для повышения читаемости правильнее использовать передачу по значению. К тому же, даже в случае не оптимизированнного кода выигрыш в одну инстукцию для "get" ф-ции byReference() по результатам профилирования не сокращает её время выполнения, в то время как "set" ф-ция setByReference() проигрывает по времени setByValue().
Миниатюры
Нажмите на изображение для увеличения
Название: test.png
Просмотров: 10
Размер:	52.0 Кб
ID:	1488847  
  Ответить с цитированием
Старый 10.09.2011, 13:53   #417   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от manifest Посмотреть сообщение
Вооружился дизассемблером и профайлером
да екжешь моксель, я уже об этом и без твоих экспериментов писал.
ты попробуй передать std::string по ссылке и по значению, и поотлаживайся в ассемблере. волосы начнут шевелиться, извиняюсь, даже на заднице))))
  Ответить с цитированием
Старый 12.09.2011, 10:53   #418   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 57

Hopkroft вне форума Не в сети
Spectator, исправь ошибку в названии темы
Срочная промощь(помощь) программистов и тема для программерского флуда
  Ответить с цитированием
Старый 12.09.2011, 11:02   #419   
Форумец
 
Аватар для Spectator
 
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46

Spectator вне форума Не в сети
Цитата:
Сообщение от Hopkroft Посмотреть сообщение
Spectator, исправь ошибку в названии темы
Срочная промощь(помощь) программистов и тема для программерского флуда
упс. слона то я и не заметил. спасибо!
  Ответить с цитированием
Старый 18.09.2011, 12:01   #420   
Форумец
 
Сообщений: 1
Регистрация: 18.09.2011
Возраст: 31

Катя Трубникова вне форума Не в сети
в exell забить китайский словарь в таблицу

нужна таблица , можно использовать словарь кит-рус abby lingua электронный, разместить по колонкам: иероглиф, транскрипция, перевод и значения. Кто может с этим помочь? и сколько это будет стоить? и какие сроки?
  Ответить с цитированием
Поиск в теме: 


Опции темы

Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind