» Программирование>Срочная помощь программистов и тема для флуда по тематике раздела
manifest 11:50 09.09.2011
Кто-нибудь знает почему в cpp не принято передавать в функцию встроенные типы по ссылке, а передают их по значению? например, func(int) а не func(const int &) ?
[Ответ]
Spectator 12:03 09.09.2011
Сообщение от manifest:
Кто-нибудь знает почему в cpp не принято передавать в функцию встроенные типы по ссылке, а передают их по значению? например, func(int) а не func(const int &) ?
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
[Ответ]
manifest 13:46 09.09.2011
Сообщение от Spectator:
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
что за адрес? на чем основано это утверждение?
ссылка - не указатель, это псевдоним, его реализация на совести компилятора. накладные расходы возникнут при копировании по значению, а вот при передаче по ссылке не все так ясно, их может вообще не быть.
[Ответ]
Spectator 14:23 09.09.2011
Сообщение от manifest:
что за адрес? на чем основано это утверждение?
Адрес памяти. На том что имею привычку смотреть на сгенерированный ассемблерный код при отладке))
Сообщение от manifest:
ссылка - не указатель, это псевдоним
понятие псевдоним процессору неизвестно)))
Сообщение от manifest:
, его реализация на совести компилятора.
Передача переменной по ссылке - это прямое указание компилятору процессору (вот ведь ступил) передать адрес, а не значение.
Сообщение от manifest:
накладные расходы возникнут при копировании по значению, а вот при передаче по ссылке не все так ясно, их может вообще не быть.
при передаче по ссылке все ясно, будет передана ссылка, как бы странно это не звучало)) Вернее - адрес переменной)
[Ответ]
Shtirliz 14:58 09.09.2011
Существует ли sdk для работы с линейкой продуктов 1С 8.x или описание серверного протокола 1С 8.x (про COM знаю, этот вариант не подходит)?
[Ответ]
Spectator 15:21 09.09.2011
Сообщение от Shtirliz:
Существует ли sdk для работы с линейкой продуктов 1С 8.x или описание серверного протокола 1С 8.x (про COM знаю, этот вариант не подходит)?
Сообщение от Shtirliz:
(про COM знаю, этот вариант не подходит)
Сообщение от http://www.realcoding.net/downloads/enterra-net-sdk-dlya-1s-versiya-17.html:
Подключение к информационной базе 1С:Предприятие осуществляется посредством технологии COM.
Сообщение от Spectator:
да и не самая лучшая это идея, его использовать.
Причина? Хотя, я, конечно, понимаю, все подводные камни реверс-инжиниринга протокола, и откажусь от идеи, если 1С не предоставляет соответствующих средств, в пользу sync сервиса на машине с 1С.
[Ответ]
manifest 15:38 09.09.2011
Сообщение от Spectator:
понятие псевдоним процессору неизвестно)))
понятие псевдоним знакомо компилятору, который будет создавать код для процессора, у него есть возожность его оптимизировать
Сообщение от Spectator:
Передача переменной по ссылке - это прямое указание процессору передать адрес, а не значение.
Сообщение от Spectator:
при передаче по ссылке все ясно, будет передана ссылка, как бы странно это не звучало)) Вернее - адрес переменной)
В случае с встроеными типами, код с аргументами ф-ции передаваемыми по значению был бы всегда эффективней кода с передачей ссылок, но это не так
[Ответ]
Shtirliz 15:41 09.09.2011
Сообщение от manifest:
если бы это было так, код с аргументами ф-ции передаваемыми по значению был бы всегда эффективней кода с передачей ссылок
Либо я чего-то не понял в фразе, либо тут логическая ошибка. Почему вы так решили? при передаче по значению происходит копирование. Передача по ссылке всегда эффективнее, но и накладывает ограничения на использование переменной.
[Ответ]
Spectator 15:46 09.09.2011
Сообщение от Shtirliz:
Причина? Хотя, я, конечно, понимаю, все подводные камни реверс-инжиниринга протокола, и откажусь от идеи, если 1С не предоставляет соответствующих средств, в пользу sync сервиса на машине с 1С.
Все что официально не открыто производителем официально не поддерживается. Т.е. при смене версии 1С вполне возможно все придется переделывать.
В WinAPI есть тоже довольно интересные недокументированные функции, которых нет в MSDN, но Microsoft их не особо скрывает. НО - никто не гарантирует что эти функции будут существовать в следующей версии Windows.
А в чем поблема с COM? Почему она (технология) не подходит?
[Ответ]
Shtirliz 15:51 09.09.2011
Сообщение от Spectator:
А в чем поблема с COM? Почему она (технология) не подходит?
Сообщение от Shtirliz:
Потому что отдельный не windows сервер.
А сразу в базу не хочешь залезть?, минуя вообще 1С, 8-ка же работает через SQL, насколько мне известно.
[Ответ]
Shtirliz 16:06 09.09.2011
Сообщение от Spectator:
А сразу в базу не хочешь залезть?, минуя вообще 1С, 8-ка же работает через SQL, насколько мне известно.
С базой есть некоторые проблемы, которые связаны, во-первых, с именованием столбцов и таблиц, во-вторых, все таки это прямой доступ к данным (а мне и писать таки надо), в-третьих, могут понадобиться еще и всяческие отчеты и т.п. хлам, который, как я понял генерируется не процедурами в БД, и, наконец, это нарушает лицензию.
[Ответ]
manifest 16:39 09.09.2011
Сообщение от Shtirliz:
Либо я чего-то не понял в фразе, либо тут логическая ошибка. Почему вы так решили? при передаче по значению происходит копирование. Передача по ссылке всегда эффективнее, но и накладывает ограничения на использование переменной.
Сообщение от Spectator:
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
Моя фраза - ответ на утверждение Spectator о том что при передаче аргумента по ссылке, фактически копируется указатель, а эта операция менее эфективна чем копирование значения переменной встроеного типа.
По моему мнению, не все так тривиально, компилятор может сформировать машинный код, который будет оперировать указателем на переменную, а может и нет. И в большинстве случаев, код с передачей по ссылке будет эффективнее. И в этом случае, встает изначальный вопрос. Зачем копировать по значению?
Сообщение от manifest:
Зачем копировать по значению?
Что бы потом не пришлось делать копирование значения внутри функции.
Сообщение от manifest:
О каких ограничениях вы говорите?
Изменение значения переменной, переданной по ссылке, может приводить к негативным последствиям, потому что распространяется за пределы данной функции.
[Ответ]
manifest 18:01 09.09.2011
Сообщение от Shtirliz:
Что бы потом не пришлось делать копирование значения внутри функции.
это вопрос стиля программирования, эффективность операции передачи аргумента по ссылке и затем его копирование, насколько я могу судить, аналогично передаче аргумента по значению. поэтому эта ситуация не интересна
Сообщение от Shtirliz:
Изменение значения переменной, переданной по ссылке, может приводить к негативным последствиям, потому что распространяется за пределы данной функции.
это не ограничение, в приведенном примере, передавать следует по ссылке на константный объект, это условие не позволит изменять объект в теле ф-ции.
[Ответ]
Shtirliz 18:11 09.09.2011
Сообщение от manifest:
это не ограничение, в приведенном примере
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается.
[Ответ]
manifest 19:11 09.09.2011
Сообщение от 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 (время выполнения бинарника)
[Ответ]
Spectator 20:36 09.09.2011
Сообщение от Shtirliz:
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается.
Ты несколько неправ. Что байт что int что ссылка передаются в одном регистре процессора. Соответственно всё что больше размерности регистра (32 или 64 в случае процессоров с 64 битными регистрами) выгодно передавать по ссылке. а что меньше - по значению. Более того - создавать байтовые переменные не рекомендуется, максимальная скорость будет достигнута если использовать тип int, даже если реально хватило бы и байта. а размер int всегда равен размерности регистра процессора целевой платформы.
[Ответ]
Spectator 20:53 09.09.2011
Сообщение от manifest:
откуда такое заключение и при чем тут размер указателя?
Для моей платформы размер int`а меньше чем указатель на него:
чем компилишь и какая целевая платформа (ну, целевой процессор, лень вспоминать точное определение)? Не должно быть так, вроде. Проверить не могу, так как у меня 32битный процессор, я просто не запущу программу.
Upd: я неправ, надо указывать явно. Неправ по поводу "а размер int всегда равен размерности регистра процессора целевой платформы." , http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Всё остальное описанное в предыдущем посте остается в силе.
[Ответ]
Spectator 21:24 09.09.2011
Немного поменял название с условием реально происходящего в теме.
[Ответ]
Shtirliz 22:17 09.09.2011
Да, согласен, меньше указателя не будет. Туплю, пятница.
А насчет теста, вы уверены в том, что компилятора не выкинул цикл как пустой? Тут кк раз ассемблерный листинг надо приводить.
[Ответ]
Spectator 22:39 09.09.2011
Сообщение от Shtirliz:
А насчет теста, вы уверены в том, что компилятора не выкинул цикл как пустой? Тут кк раз ассемблерный листинг надо приводить.
Здесь крайне согласен, по поводу ассемблерного листинга, или - хотя бы выключить всю оптимизацию.
Хотя тут зависит от компилятора, если компилятор Borland/Inpise с выключенной оптимизацией честно будет тупо все транслировать в машинные коды построчно, то Visual C++ крайне своенравный и в Release билде частенько плюет на опции и директивы, вполне, к примеру, может заинлайнить функцию, даже если дашь указание не инлайнить вообще ничего. Или - наоборот, но это уже документировано, указания инлайна нет, есть только предложение компилятору по воооозможности заинлайнить.
Так что в ассемблерный код в критичных функциях заглядывать надо обязательно.
[Ответ]
Мистер 09:00 10.09.2011
Где у вас тут можно узнать про 1С Бухгалтерию?
[Ответ]
Spectator 12:00 10.09.2011
Сообщение от Мистер:
Где у вас тут можно узнать про 1С Бухгалтерию?
Для начала здесь и спрашивай. На основе ответа отошлем))) куда надо. А может и даже я что посоветую, хотя и не специалист в этом вопросе. Sandy иногда сюда заглядывает вроде, он шарит.
Я планирую создать подраздел для 1Сников, но это надо с Антоном связываться и пока не совсем понятно - нужно ли это, или нет. Не так уж много и тем, связанных с 1С.
Хотя, сделаю так - в течении дня создам просто тему, в которую свалю всё что связано с 1С, и сделаю ее важной. Вот там и задашь, если не горит.
Если разрешить компилятору оптимизировать, будет сформирован аналогичный код, как для случая передачи по значению, так и для передачи по ссылке:
Код:
//// 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().
Изображения
Сообщение от manifest:
Вооружился дизассемблером и профайлером
да екжешь моксель, я уже об этом и без твоих экспериментов писал.
ты попробуй передать std::string по ссылке и по значению, и поотлаживайся в ассемблере. волосы начнут шевелиться, извиняюсь, даже на заднице))))
[Ответ]
Hopkroft 10:53 12.09.2011
Spectator, исправь ошибку в названии темы
Срочная промощь(помощь) программистов и тема для программерского флуда
[Ответ]
Spectator 11:02 12.09.2011
Сообщение от Hopkroft: Spectator, исправь ошибку в названии темы
Срочная промощь(помощь) программистов и тема для программерского флуда
нужна таблица , можно использовать словарь кит-рус abby lingua электронный, разместить по колонкам: иероглиф, транскрипция, перевод и значения. Кто может с этим помочь? и сколько это будет стоить? и какие сроки?
[Ответ]