我在c ++中做了一个简单的程序来比较两种方法之间的性能 – 传递值和传递参考。 其实通过价值performance比通过参考更好。 结论应该是传递值需要更less的时钟周期(指令) 如果有人能够详细解释为什么按价值传递需要更less的时钟周期,我会很高兴。 #include <iostream> #include <stdlib.h> #include <time.h> using namespace std; void function(int *ptr); void function2(int val); int main() { int nmbr = 5; clock_t start, stop; start = clock(); for (long i = 0; i < 1000000000; i++) { function(&nmbr); //function2(nmbr); } stop = clock(); cout << "time: " […]
可能重复: Java是“通过引用”吗? 我今天发现了一种不寻常的Java方法: private void addShortenedName(ArrayList<String> voiceSetList, String vsName) { if (null == vsName) vsName = ""; else vsName = vsName.trim(); String shortenedVoiceSetName = vsName.substring(0, Math.min(8, vsName.length())); //SCR10638 – Prevent export of empty rows. if (shortenedVoiceSetName.length() > 0) { if (!voiceSetList.contains("#" + shortenedVoiceSetName)) voiceSetList.add("#" + shortenedVoiceSetName); } } 根据我所读到的关于Java传递variables,复杂对象的行为的一切,这段代码应该什么也不做。 所以呃…我在这里错过了什么? 有没有一些微妙的东西丢在我身上,还是这个代码属于dailywtf?
这是最近在代码审查讨论中提出的,但没有得到令人满意的结论。 所讨论的types与C ++ string_view TS类似。 他们是简单的非拥有包装指针和长度,用一些自定义函数装饰: #include <cstddef> class foo_view { public: foo_view(const char* data, std::size_t len) : _data(data) , _len(len) { } // member functions related to viewing the 'foo' pointed to by '_data'. private: const char* _data; std::size_t _len; }; 问题出现在于是否有一个参数可以通过值或const引用传递这种视图types(包括即将到来的string_view和array_viewtypes)。 赞成按值传递的论据等于“较less打字”,“如果视图具有有意义的突变,则可以突变本地副本”,以及“可能效率不高”。 支持传递const引用的论据相当于“更习惯于通过const&传递对象”和“可能效率不高”。 是否有任何额外的考虑可能以某种方式决定性地摆动论点,或者根据价值或常量引用来传递惯用视图types。 对于这个问题,假定C ++ 11或C ++ 14语义以及足够现代的工具链和目标体系结构是安全的。
我想模仿python中的传值行为。 换句话说,我想确保我写的函数不会修改用户提供的数据。 一种可能的方法是使用深层复制: from copy import deepcopy def f(data): data = deepcopy(data) #do stuff 是否有更高效或更pythonic的方式来实现这一目标,尽可能less的假设尽可能传递的对象(如.clone()方法) 编辑 我知道在技术上,python中的所有东西都是按值传递的。 我对模拟行为感兴趣,也就是确保我不会混淆传递给函数的数据。 我想最通用的方法是用自己的克隆机制或深度拷贝克隆有问题的对象。
当你传递一个集合像列表,数组到Python中的另一个函数,它是否复制它,或者它只是一个指针?
在什么情况下我应该喜欢通过参考? 传递的价值?
下面是C编程只是常见问题的一个片段。 这是不是错误的数组不能通过引用传递? 八.6:如何通过值传递一个数组到一个函数? 答案:可以通过在被调用的函数中声明带有方括号( [和] )的数组名来在数组中传递数组。 调用该函数时,只需将该数组的地址(即数组的名称)传递给被调用的函数。 例如,以下程序通过值将数组x[]传递给名为byval_func()的函数: int[]参数告诉编译器byval_func()函数将接受一个参数 – 一个整数数组。 当byval_func()函数时,将数组的地址传递给byval_func() : byval_func(x); 因为数组是按值传递的,所以数组的一个精确的拷贝被放在堆栈上。 被调用的函数然后接收这个数组的拷贝并且可以打印它。 因为传递给byval_func()的数组是原始数组的副本,所以在byval_func()函数内修改数组对原始数组没有影响。
如果我有一个需要使用shared_ptr的函数,将它的引用传递给它是不是更有效率(所以为了避免复制shared_ptr对象)? 什么是可能的不良副作用? 我设想了两种可能的情况: 1)里面的函数副本是由参数,如在 ClassA::take_copy_of_sp(boost::shared_ptr<foo> &sp) { … m_sp_member=sp; //This will copy the object, incrementing refcount … } 2)里面的函数只是使用参数,就像 Class::only_work_with_sp(boost::shared_ptr<foo> &sp) //Again, no copy here { … sp->do_something(); … } 在这两种情况下,我都看不到通过值而不是引用传递boost::shared_ptr<foo>的好理由。 按值传递只会“暂时”增加由于复制引起的引用计数,然后在退出函数范围时将其递减。 我可以俯视吗? 为了澄清,在阅读了几个答案之后,我完全赞同过早优化的问题,而且我总是试图首先在那个热点上工作。 如果你明白我的意思,我的问题更多的来自纯技术的代码观点。
如何在Python中通过引用传递一个整数? 我想修改我传递给函数的variables的值。 我已经读过,Python中的所有东西都是按照价值传递的,但是必须有一个简单的技巧。 例如,在Java中,您可以传递Integer , Long等引用types 我怎样才能通过引用传递一个整数到一个函数? 什么是最佳实践? 谢谢!
我习惯于在C : void main() { String zText = ""; fillString(zText); printf(zText); } void fillString(String zText) { zText += "foo"; } 输出是: foo 但是,在Java中,这似乎不起作用。 我假设,因为String对象被复制,而不是通过引用传递 。 我认为string是对象,它总是通过引用传递。 这里发生了什么?