Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Срочная помощь программистов и тема для флуда по тематике раздела |
Философия, технологии, алгоритмы! |
|
Опции темы |
09.09.2011, 12:03 | #392 |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
во втором случае будет передаваться адрес, а не значение, соответственно в вызываемой функции будет разыменование, лишняя операция.
|
09.09.2011, 13:46 | #393 | |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Цитата:
ссылка - не указатель, это псевдоним, его реализация на совести компилятора. накладные расходы возникнут при копировании по значению, а вот при передаче по ссылке не все так ясно, их может вообще не быть. |
|
09.09.2011, 14:23 | #394 |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Адрес памяти. На том что имею привычку смотреть на сгенерированный ассемблерный код при отладке))
понятие псевдоним процессору неизвестно))) Передача переменной по ссылке - это прямое указание компилятору при передаче по ссылке все ясно, будет передана ссылка, как бы странно это не звучало)) Вернее - адрес переменной) Последний раз редактировалось Spectator; 10.09.2011 в 00:04. |
09.09.2011, 15:21 | #396 | |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
http://www.realcoding.net/downloads/...ersiya-17.html Протокол 1С наверняка закрыт, да и не самая лучшая это идея, его использовать. |
|
09.09.2011, 15:35 | #397 | |
Форумец
Сообщений: 248
Регистрация: 17.01.2005
Не в сети |
Spectator,
Цитата:
|
|
09.09.2011, 15:38 | #398 | |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
понятие псевдоним знакомо компилятору, который будет создавать код для процессора, у него есть возожность его оптимизировать
Цитата:
|
|
09.09.2011, 15:41 | #399 |
Форумец
Сообщений: 248
Регистрация: 17.01.2005
Не в сети |
Либо я чего-то не понял в фразе, либо тут логическая ошибка. Почему вы так решили? при передаче по значению происходит копирование. Передача по ссылке всегда эффективнее, но и накладывает ограничения на использование переменной.
|
09.09.2011, 15:46 | #400 | |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
В WinAPI есть тоже довольно интересные недокументированные функции, которых нет в MSDN, но Microsoft их не особо скрывает. НО - никто не гарантирует что эти функции будут существовать в следующей версии Windows. А в чем поблема с COM? Почему она (технология) не подходит? |
|
09.09.2011, 16:06 | #403 |
Форумец
Сообщений: 248
Регистрация: 17.01.2005
Не в сети |
С базой есть некоторые проблемы, которые связаны, во-первых, с именованием столбцов и таблиц, во-вторых, все таки это прямой доступ к данным (а мне и писать таки надо), в-третьих, могут понадобиться еще и всяческие отчеты и т.п. хлам, который, как я понял генерируется не процедурами в БД, и, наконец, это нарушает лицензию.
|
09.09.2011, 16:39 | #404 | ||
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Цитата:
Цитата:
По моему мнению, не все так тривиально, компилятор может сформировать машинный код, который будет оперировать указателем на переменную, а может и нет. И в большинстве случаев, код с передачей по ссылке будет эффективнее. И в этом случае, встает изначальный вопрос. Зачем копировать по значению? О каких ограничениях вы говорите? |
||
09.09.2011, 16:49 | #405 |
Форумец
Сообщений: 248
Регистрация: 17.01.2005
Не в сети |
Что бы потом не пришлось делать копирование значения внутри функции.
Изменение значения переменной, переданной по ссылке, может приводить к негативным последствиям, потому что распространяется за пределы данной функции. |
09.09.2011, 18:01 | #406 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
это вопрос стиля программирования, эффективность операции передачи аргумента по ссылке и затем его копирование, насколько я могу судить, аналогично передаче аргумента по значению. поэтому эта ситуация не интересна
это не ограничение, в приведенном примере, передавать следует по ссылке на константный объект, это условие не позволит изменять объект в теле ф-ции. |
09.09.2011, 18:11 | #407 |
Форумец
Сообщений: 248
Регистрация: 17.01.2005
Не в сети |
А я как обычно пример-то и не посмотрел. Ну в приведенном примере на 32bit ОС разницы не будет. Разница будет только если размер указателя больше размера переменной, ну то есть, например, для байта более эффективно передавать по значению, чем по ссылке.
Я бы передавал по значению, просто потому что писать меньше и код более читабельный получается. |
09.09.2011, 19:11 | #408 | |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Цитата:
Для моей платформы размер 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 |
|
09.09.2011, 20:36 | #409 | |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
|
|
09.09.2011, 20:53 | #410 | |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
Upd: я неправ, надо указывать явно. Неправ по поводу "а размер int всегда равен размерности регистра процессора целевой платформы." , http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx Всё остальное описанное в предыдущем посте остается в силе. |
|
09.09.2011, 22:39 | #413 | |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Цитата:
Хотя тут зависит от компилятора, если компилятор Borland/Inpise с выключенной оптимизацией честно будет тупо все транслировать в машинные коды построчно, то Visual C++ крайне своенравный и в Release билде частенько плюет на опции и директивы, вполне, к примеру, может заинлайнить функцию, даже если дашь указание не инлайнить вообще ничего. Или - наоборот, но это уже документировано, указания инлайна нет, есть только предложение компилятору по воооозможности заинлайнить. Так что в ассемблерный код в критичных функциях заглядывать надо обязательно. |
|
10.09.2011, 12:00 | #415 |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
Для начала здесь и спрашивай. На основе ответа отошлем))) куда надо. А может и даже я что посоветую, хотя и не специалист в этом вопросе. 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 |
Форумец
Сообщений: 231
Регистрация: 26.02.2007
Не в сети |
Вооружился дизассемблером и профайлером
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(). |
10.09.2011, 13:53 | #417 |
Форумец
Сообщений: 41,173
Регистрация: 27.05.2003
Возраст: 46
Не в сети |
|
18.09.2011, 12:01 | #420 |
Форумец
Сообщений: 1
Регистрация: 18.09.2011
Возраст: 31
Не в сети |
в exell забить китайский словарь в таблицу
нужна таблица , можно использовать словарь кит-рус abby lingua электронный, разместить по колонкам: иероглиф, транскрипция, перевод и значения. Кто может с этим помочь? и сколько это будет стоить? и какие сроки?
|