Articles of c + +

Memcpy与memset相同

我想用memcpy来测量内存带宽。 我从这个答案修改了代码: 为什么vector化循环没有使用memset来衡量带宽的性能改进 。 问题是memcpy只比memset稍慢,因为我认为memcpy运行速度是内存两倍以上的两倍。 更具体地说,我运行了超过1 GB的数组a和b (分配将calloc )100次,执行以下操作。 operation time(s) —————————– memset(a,0xff,LEN) 3.7 memcpy(a,b,LEN) 3.9 a[j] += b[j] 9.4 memcpy(a,b,LEN) 3.8 请注意, memcpy只比memset慢一点。 a[j] += b[j] (其中j越过[0,LEN) )的操作应该比memcpy长三倍,因为它操作的数据量是三倍。 但是它只有memset 2.5左右。 然后我用memset(b,0,LEN)将b初始化为零并再次testing: operation time(s) —————————– memcpy(a,b,LEN) 8.2 a[j] += b[j] 11.5 现在我们看到, memcpy大约是memset两倍, a[j] += b[j]大约是memset三倍。 至less我会预期,在memset(b,0,LEN) , memcpy会比较慢,因为 100次迭代中的第一次迭代的延迟分配(第一次触发) 。 为什么我只能在memset(b,0,LEN)之后得到预期的时间? test.c的 #include <time.h> […]

xlib是否有一个活动的窗口事件?

我正在尝试编写一个程序来跟踪活动窗口使用Xlib时的变化。 我很难找出最好的方法来做到这一点。 这些是我的想法到目前为止: 每秒钟使用_NET_ACTIVE_WINDOW来获取活动窗口,如果它已经改变,然后运行事件的相关代码。 获取所有窗口的列表,并听取他们的重点事件。 我将不得不弄清楚如何保持最新的打开窗口列表。 他们是一个更简单/更好的方法? 我是用Xlib编程的新手。

在Linux上编译一个基本的OpenCV + Cuda程序

我曾经在linux上使用过opencv,但是没有使用cuda。 我已经努力了几个月的以下编译错误。 在尝试了许多解决scheme后,我放弃了使用windows。 不过,我真的想在Linux上工作。 这是我用来编译opencv_gpu网站上给出的阈值示例的命令。 nvcc `pkg-config –libs opencv` -L. -L/usr/local/cuda/lib -lcuda -lcudart `pkg-config –cflags opencv` -I. -I/usr/local/cuda/include threshold.cpp -o threshold 这里是错误的: /tmp/tmpxft_0000171b_00000000-1_threshold.o: In function `main': threshold.cpp:(.text+0x124): undefined reference to `cv::gpu::Stream::Null()' threshold.cpp:(.text+0x156): undefined reference to `cv::gpu::threshold(cv::gpu::GpuMat const&, cv::gpu::GpuMat&, double, double, int, cv::gpu::Stream&)' threshold.cpp:(.text+0x16d): undefined reference to `cv::gpu::GpuMat::download(cv::Mat&) const' /tmp/tmpxft_0000171b_00000000-1_threshold.o: In function `cv::gpu::GpuMat::GpuMat(cv::Mat const&)': threshold.cpp:(.text._ZN2cv3gpu6GpuMatC1ERKNS_3MatE[cv::gpu::GpuMat::GpuMat(cv::Mat const&)]+0x63): […]

free()是否删除存储在dynamic分配内存中的数据?

我写了一个简单的程序来testingfree()后的dynamic分配内存的内容,如下所示。 (我知道我们不应该在空闲后访问内存,我写了这个来检查空闲内存后会有什么内容) #include <stdio.h> #include <stdlib.h> main() { int *p = (int *)malloc(sizeof(int)); *p = 3; printf("%d\n", *p); free(p); printf("%d\n", *p); } 输出:3 0 我以为它会打印垃圾值或第二次打印声明崩溃。 但它总是打印0。 1)这种行为是否依赖于编译器? 2)如果我试图释放内存两次释放(),核心转储正在生成。 在手册页中提到程序行为是exception的。 但是我总是得到核心转储。 这种行为是否也依赖于编译器?

如何在其默认程序 – Linux中打开文件

如何以编程方式在Linux的默认程序中打开文件(即时通讯使用Ubuntu 10.10)。 例如,打开* .mp3将打开电影播放器​​(或其他)中的文件。 先谢谢你。 斯捷潘

我如何运行一个外部程序?

我在Linux mint 12上。 我想运行一个程序usr/share/application/firefox ,然后在任何地方传递一个string。 我还没有find针对Linux的解决scheme,但从目前为止我所看到的有很多关于Windows的理论。 size_t ExecuteProcess(std::wstring FullPathToExe, std::wstring Parameters, size_t SecondsToWait) { size_t iMyCounter = 0, iReturnVal = 0, iPos = 0; DWORD dwExitCode = 0; std::wstring sTempStr = L""; /* – NOTE – You should check here to see if the exe even exists */ /* Add a space to the beginning […]

如何让更多的内存和避免堆栈溢出大量的recursion?

我正在testing执行大量recursion调用的algorithm的时间。 我的程序在约128k的recursion调用中死亡,这只需要0.05秒。 我想让更多的记忆在我的分析中有更长的时间。 我正在运行Linux和使用gcc。 是否有一个系统调用,或环境variables,或gcc标志,或包装,或什么?

如何在Linux中重新绑定udp套接字

我是一个有经验的Linux套接字编程人员,正在编写一个有很多出接口的服务器应用程序。 现在,服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口。 稍后在提交对特定节点的响应时,我需要分配一个固定的源IP地址 。 标准的做法是调用bind。 但是,绑定被调用一次端口号, 连续调用失败,无效的参数错误。 创build一个新的套接字并不是一个好的select,因为在响应某些客户端时,我将不得不经常这样做。 我也探讨了SO和许多套接字选项,如IP_FREEBIND,但它并不完全符合我的scheme。 也许使用IP_PKT_INFO和设置源地址可能会工作,除非它遭受同样的问题,即不允许套接字一旦绑定到INADDRANY重新绑定到一个固定的源IP后者。 有没有办法解除绑定现有的套接字或替代方式来设置传出数据包中的源IP地址? int sock = socket(AF_INET, SOCK_DGRAM, 0); if(sock < 0) printf("Failed creating socket\n"); struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(1500); addr.sin_addr.s_addr = INADDR_ANY; // first bind succeeds if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0) […]

等待多个信号而不需要等待(C / C ++ Linux)

如果我有多个信号量,那么我怎么能有一个进程块,直到至less有一个信号量是免费的? 我知道我可以用忙等待循环来做到这一点,例如: // blocks until one of the semaphores in sems is free, returns // index of semaphore that was available int multiple_sem_wait(sem_t **sems, int num_sems) { while (true) { for (int i = 0; i < num_sems; ++i) { if (sem_trywait(sems[i]) == 0) { return i; } } } } 但是有没有办法做到这一点,没有繁忙的循环? 也许除了应该使用的信号量外,还有一些IPC技术? 谢谢

编译我自己的内核(而不是从linux-kernel源代码)

我从这里跟随内核教程 即时通讯编辑我的文件有问题。 当我尝试编译时出现以下错误: main.c:8: error: expected declaration specifiers or '…' before 'size_t' main.c:8: error: conflicting types for 'memcpy' ./include/system.h:5: note: previous declaration of 'memcpy' was here main.c: In function 'memcpy': main.c:12: error: 'count' undeclared (first use in this function) main.c:12: error: (Each undeclared identifier is reported only once main.c:12: error: for each function it appears […]