Articles of c + +

如何dynamic地分配大内存,如10 G,在64-linux上使用c ++的新操作符?

我需要dynamic分配一个更大的浮点数组为一个特殊的应用程序使用C + +新操作符,如10G。 运行在64-ubuntu-14.04 Linux OS上的代码,带有64G内存。 当我把内存的请求设置为大约7G, 1879048192×4/(1024x1024x1024)=7G (浮点数有4个字节),像这样: float * data; data = new float[1879048192]; 程序运行良好,但是当我尝试增加对10G的请求时,我得到了一个what(): std::bad_alloc 。 我也尝试使用malloc()来取代新的操作符: data =(float*)malloc(1879048192*sizeof(float)); 但是获得相同的结果。 我的ulimit -a是这样的: core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 514689 max locked memory (kbytes, -l) […]

如何在linux中打败core i3 / i7中的硬件预取器

我试图find一种方法来击败H / W预取器来检测stream模式,并以随机顺序访问4KB数据,以使其不被H / W预取器检测和预取。 最初,我打算以随机模式访问所有偶数索引数据,因为H / W预取器总是预取下一个caching行(所以当我访问偶数索引时,下一个奇数索引数据已经被预取)。 我编写了代码以随机模式访问所有偶数索引数据,但是结果表明预取器检测到模式(不知道怎么做?没有固定的跨度,都是随机跨度) 我正在调查原因 – 为什么发生这种情况,然后我在英特尔find了这篇文章; https://software.intel.com/en-us/forums/topic/473493 根据John D. McCalpin博士的博士“Bandwidth博士, 在“Intel 64和IA-32架构优化参考手册”(文档248966-028,2013年7月)的第2.2.5.4节中,它指出, stream媒体预取器“[d]检测和维护多达32个数据访问stream,对于每个4K字节的页面,可以保持一个前向和一个后向stream。 这意味着L2硬件预取器跟踪最近访问的16个4KiB页面,并记住足够的这些页面的访问模式以跟踪一个前向stream和一个后向stream。 因此,要使用“随机”提取来击败L2stream转预取器,只需确保您访问超过15个其他4个KiB页面,然后再对先前引用的页面进行第二次引用。 所以一个“随机”取序列可能由16个以上的4个KiB页码随机排列组成,每个页面内有一个随机偏移量。 (我通常在我的排列列表中使用至less32页。) 所以它意味着在访问相同的4KB页面的两个不同的随机索引之间,我们需要访问至less16个4KB页面来击败H / W预取器。 我已经实现了John D. McCalpin所提出的概念,然而结果再一次显示了h / w预取器没有被击败。 它能够检测某些模式和预取数据(请参阅示例输出)。 我从20-40页的4KB页面访问页数不一样,但结果没有改进/改变。 这是我的代码: #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sched.h> #ifndef _POSIX_THREAD_PROCESS_SHARED #error This system does not […]

使用gSoap进行asynchronous,确认的点对点连接

这是我的情况: 我有一个wsdl ,“翻译”到这样的头文件: wsdl2h -o file.h file.wsdl 然后,我执行了soapcpp2 -Icorrect_path -j file.h 在“服务器端”我使用soapXXXService.[h|cpp]实现了服务soapXXXService.[h|cpp] 再次在“服务器端”,我用soap_init2 (与SOAP_IO_KEEPALIVE ),我有soap_bind , soap_accept , soap_copy等,它似乎工作得很好(见下文) 在“客户端”,我使用生成的proxy对象(再次使用SOAP_IO_KEEPALIVE ),构造消息并将其发送到服务器 “服务器”收到这个消息并且发回ACK (自定义XML ) “客户端”收到ACK ,一切都很完美。 所以,我现在要做的就是让“服务器”返回到“客户端”的“真实”响应,“客户端”必须返回一个ACK到“服务器”。 这怎么可能? (它应该是) “你有什么尝试?” 我想起了两件事。 首先是以某种方式重用从soap_accept返回的套接字的文件描述符,将“真正的响应”发送回服务器。 但这是可能的吗? Unix套接字是全双工的,所以这在技术上是可行的,但gSoap限制了这一点? 因为在文档中我没有看到任何关于此的内容。 第二个选项,我想到的是在“客户端”中创build相同的“服务”,使其能够接收消息(“真正的响应”),并以“服务器”中的方式返回ACK ”。 但是这意味着,“服务器”还必须有一个proxy对象的实例才能够发送这个所谓的“真实的回应”。 这听起来对我来说真是丑陋而可怕。 如果这是唯一的select,我不会感到惊讶,但.. 编辑:第二个选项 – 这将意味着,客户端应该有一个侦听器端口,应该处理传入的连接等。不听起来像一个客户端给我.. 我明白,我可能会错过gSoap工作的一些基本部分,但是我阅读了整个用户文档和“入门”指南 ,但是我没有find任何有关这方面的信息。 请让我知道,如果有什么不清楚 编辑:这是情景,我想实现: 客户端向服务器发送请求 服务器返回ACK作为响应(如标准ACK) – 成功收到请求的信号 之后,服务器向客户端发送响应 (这是真正的响应) 客户端再次返回ACK – […]

在Ubuntu 8.1上找不到g ++ – 4.1或其他版本的size_t

这发生在我之前,但我不记得我是如何修复它的。 我不能在一个新的Ubuntu安装程序在这里编译一些程序…有些东西与我的头错误。 我已经试过g ++ – 4.1和4.3无济于事。 g++ -g -frepo -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include -c qlisttest.cpp /usr/include/libio.h:332: error: 'size_t' does not name a type /usr/include/libio.h:336: error: 'size_t' was not declared in this scope /usr/include/libio.h:364: error: 'size_t' has not been declared /usr/include/libio.h:373: error: 'size_t' has not been declared /usr/include/libio.h:493: error: 'size_t' does not name a type /usr/include/stdio.h:294: […]

信号SIGFPE问题

我是Linux新手,请帮忙。 以下代码在Linux 2.6 gcc中运行时获得核心转储。 $ ./a.out 浮点exception(核心转储) 问题: 1.由于安装了过程信号掩码,因此不应该禁止第40行(z = x / y)生成的“SIGFPGE” 2.如果未被阻止,由于已经安装了一个信号处理程序,不应该由信号处理程序捕获“SIGFPE”,而不是核心转储? 3.如果我将第40行(z = x / y)注释掉,并使用第42行(raise(SIGFPE)),那么所有事情都按我的预期工作。 这里有什么区别x / 0和提高SIGFPE? 这里是代码: #include <stdio.h> #include <stdlib.h> #include <signal.h> void sig_handler(int signum) { printf("sig_handler() received signal %d\n", signum); } int main(int argc, char * argv[]) { // setup signal mask, block all signals sigset_t set; […]

我如何保留内存地址而不分配它们

我希望(在* nix中)分配一个大的连续的地址空间,但是不要马上消耗资源,也就是说我想保留一个地址范围,以后再分配给它。 假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G的计算机上有1G的交换文件。 它会失败,对吧? 我想要做的是说“给我一个内存地址范围foo … foo + 3G 我将分配 ”,所以我可以保证在这个区域内的所有分配是连续的,但没有实际分配直接。 在上面的例子中,我想跟随一个bar = malloc(123)调用foo = reserve_memory(3G)调用,它应该成功,因为reserve_memory还没有消耗任何资源,它只是保证吧不会在范围内烟草工业富+ 3G。 后来我会做一些像allocate_for_real(foo,0,234)来消耗foo范围的字节0..234。 在这一点上,内核将分配一些虚拟页面,并将它们映射到foo + 123 + N 这是可能的用户空间? (这一点是foo中的对象需要是连续的,创build后不能合理地移动。) 谢谢。

在共享库的构build选项中添加“-rpath,/ usr / lib”会导致段错误

我有一个你好世界计划。 #include <stdio.h> #include <stdlib.h> int main() { printf("hello world! \n"); return 0; } 我在链接阶段的程序-lmicroxml中添加-lmicroxml以链接到库libmicroxml.so 当我启动我的程序时,我得到了一个分段错误。 分段故障与libmicroxml.so的加载有关。 在我的helleo世界计划执行的strace之后: strace ./test execve("./test", ["./test"], [/* 11 vars */]) = 0 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x777de000 stat("/etc/ld.so.cache", 0x7f944760) = -1 ENOENT (No such file or directory) open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or […]

什么是intptr_t,它是一个整数或指针的types?

它在/usr/include/stdint.h定义: typedef long int intptr_t; 它应该是一个整数或指针的types?

使成功终止gdb自动退出?

我使用一个debugging脚本连续运行几个相关的进程与debugging器。 我目前使用-x自动执行几个命令(如run )。 如何在debugging过程成功终止时自动退出gdb? 向命令文件添加一个quit命令将导致该命令不仅在成功终止时被处理,而且还会在发生错误时(当时我宁愿接pipe)。 以下是正在发生的事情摘录: + gdb -return-child-result -x gdbbatch –args ./mkfs.cpfs / dev / loop0 GNU gdb(GDB)7.1-ubuntu 读取/home/matt/cpfs/mkfs.cpfs…done中的符号。 程序正常退出。 断点2在0x805224f:文件log.c,第32行。 (GDB) gdbbatch内容: 开始 b cpfs_log如果级别> =警告

未注册端口重组错误的nf_conntrack_helper_register

我有以下代码来注销和注册sip conntrack从内核3.18 static void __nf_conntrack_sip_fini(void) { int i, j; for (i = 0; i < ports_c; i++) { for (j = 0; j < ARRAY_SIZE(sip[i]); j++) { if (sip[i][j].me == NULL) continue; nf_conntrack_helper_unregister(&sip[i][j]); } } memset(sip, 0, sizeof(sip)); } static int __nf_conntrack_sip_init(void) { int i, j, ret; if (ports_c == 0) ports[ports_c++] = SIP_PORT; for […]