{"id":3961,"date":"2019-01-07T19:30:43","date_gmt":"2019-01-07T18:30:43","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3961"},"modified":"2019-01-07T19:34:32","modified_gmt":"2019-01-07T18:34:32","slug":"c-guns-passing-function-objects-around-update-example-random-generators","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3961","title":{"rendered":"C++ Guns: Passing function objects around (Update Example random generators)"},"content":{"rendered":"<p>Update zu <a href=\"http:\/\/roboblog.fatal-fury.de\/?p=2309\">Passing random generators around (functor)<\/a> In jenen Beispiel habe ich den RNG per <em>std::function<\/em> \u00fcbergeben. Das muss nicht sein. Mit <em>std::function<\/em> verliert man die inline Performance. Und es geht auch ohne seltsames <em>std::bind<\/em>.<\/p>\n<p>Aktualisierter Code:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;random&gt;\r\n#include &lt;iostream&gt;\r\n#include &lt;functional&gt;\r\n#include &lt;omp.h&gt;\r\n\r\n\/\/ can be passed by value. it has no state\r\ntemplate&lt;typename Function&gt;\r\nint function2(Function dice) {\r\n  int sum = 0;\r\n  for(int i=0; i &lt; 1000; i++) {\r\n    sum += dice();\r\n  }\r\n  return sum;\r\n}\r\n\r\n\/\/ pass by reference, it has state\r\nint function(std::minstd_rand&amp; generator) {\r\n  \/\/ we need random numbers from 0 to 10\r\n  std::uniform_int_distribution&lt;int&gt; distribution(0,10);\r\n  \/\/ lambda instead of bind\r\n  auto dice = &#x5B;&amp;](){ return distribution(generator); };\r\n\r\n  return function2(dice);\r\n}\r\n\r\nint main() {\r\n  omp_set_num_threads(2);\r\n\r\n  \/\/ create  random generatores with random seed\r\n  std::minstd_rand seedGen;\r\n  std::minstd_rand generators&#x5B;omp_get_num_threads()];\r\n  for(int i=0; i &lt; omp_get_num_threads(); i++) {\r\n    generators&#x5B;i].seed(seedGen());\r\n  }\r\n\r\n#pragma omp parallel for\r\n  for(int i=0; i &lt; 8; i++) {\r\n    const int id = omp_get_thread_num();\r\n    \/\/ pass one generator to our function\r\n    int sum = function(generators&#x5B;id]);\r\n\r\n    std::cout &lt;&lt; &quot;Thread &quot; &lt;&lt; id &lt;&lt; &quot; sum &quot; &lt;&lt; sum &lt;&lt; &quot;\\n&quot;;\r\n  }\r\n\r\n  std::cout &lt;&lt; &quot;Info sizeof std::function&lt;int()&gt; &quot; &lt;&lt; sizeof(std::function&lt;int()&gt;) &lt;&lt; &quot;\\n&quot;;\r\n\r\n  return 0;\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Update zu Passing random generators around (functor) In jenen Beispiel habe ich den RNG per std::function \u00fcbergeben. Das muss nicht sein. Mit std::function verliert man die inline Performance. Und es geht auch ohne seltsames std::bind. Aktualisierter Code: #include &lt;random&gt; #include &lt;iostream&gt; #include &lt;functional&gt; #include &lt;omp.h&gt; \/\/ can be passed by value. it has no state [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3961","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3961"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3961\/revisions"}],"predecessor-version":[{"id":3982,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3961\/revisions\/3982"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3961"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}