小编Ema*_*ele的帖子

clang ++ ABI和g ++一样吗?

可能重复:
GCC 4.0,4.2和LLVM ABI兼容性

根据主题,C++ ABI兼容吗?
即,可以使用前者生成的二进制(共享对象)并与后者链接(反之亦然)?

干杯

c++ linux gcc clang

18
推荐指数
1
解决办法
1万
查看次数

为什么gcc不将_mm256_loadu_pd解析为单个vmovupd?

我正在编写一些AVX代码,我需要从可能未对齐的内存中加载.我目前正在加载4个双打,因此我将使用内部指令_mm256_loadu_pd ; 我写的代码是:

__m256d d1 = _mm256_loadu_pd(vInOut + i*4);
Run Code Online (Sandbox Code Playgroud)

然后,我使用选项进行编译,-O3 -mavx -g然后使用objdump获取汇编代码以及带注释的代码和line(objdump -S -M intel -l avx.obj).
当我查看底层汇编程序代码时,我发现以下内容:

vmovupd xmm0,XMMWORD PTR [rsi+rax*1]
vinsertf128 ymm0,ymm0,XMMWORD PTR [rsi+rax*1+0x10],0x1
Run Code Online (Sandbox Code Playgroud)

我期待看到这个:

vmovupd ymm0,XMMWORD PTR [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)

并充分利用256位寄存器(YMM0),而不是它看起来像海湾合作委员会已决定在128位部分(填写XMM0),然后再次加载另一半vinsertf128.

有人能够解释这个吗?在MSVC VS 2012中
使用单个vmovupd编译等效代码.

我运行gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0Ubuntu的18.04 X86-64.

assembly gcc simd vectorization avx

13
推荐指数
2
解决办法
464
查看次数

是否确认了getnameinfo内存泄漏?

根据问题,我遇到了getnameinfo泄漏的内存.我正在使用Uccntu 12.04(Linux scv 3.2.0-35-generic#55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux)和gcc 版本4.6.3.
我将我的服务器可执行文件与g ++链接,到目前为止valgrind尚未报告问题.然后我添加了一个简单的调用getnameinfo来打印出连接客户端的网络名称和端口.
我得到以下内容:

==4425== 
==4425== HEAP SUMMARY:
==4425==     in use at exit: 10 bytes in 1 blocks
==4425==   total heap usage: 4,508 allocs, 4,507 frees, 134,939,153 bytes allocated
==4425== 
==4425== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4425==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4425==    by 0x50D7D71: strdup (strdup.c:43)
==4425==    by …

c c++ memory-leaks network-programming

12
推荐指数
1
解决办法
804
查看次数

线程和fork().我该怎么处理?

可能重复:
在多线程程序中fork

如果我有一个使用fork()并且可能被开发为多线程的应用程序,那么为安全地编程这种应用程序需要考虑哪些拇指规则/指南?

c c++ linux multithreading fork

7
推荐指数
1
解决办法
1574
查看次数

将epoll用于设备(​​/ dev/event/...)是否有效?

我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad); 我设法使用uinput接口创建它,我正确设置它并且它工作得很好.

为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这些标志打开真实的设备文件:

fd = open("/dev/input/event22", O_RDONLY); // open the PS3 pad
Run Code Online (Sandbox Code Playgroud)

主循环类似于(减去错误检查):

while(run) {
    input_event ev = {0};
    read(fd, &ev, sizeof(struct input_event));
    // convert from PS3 --> Xbox 360
    convert(ev);
    // write to the new virtual pad
    write(fd_virtual, &ev, sizeof(struct input_event));
}
Run Code Online (Sandbox Code Playgroud)

你可以想象这read(fd, &ev, sizeof(struct input_event));是一个阻塞调用,我希望有一种超时循环循环并检查其他事件/执行其他代码.

由于这些原因,我想read(fd...epoll循环中封装该调用,所以我也可以暂停.

问题是,以这种方式完成它会有效吗?通过使用epoll_wait,我是否会对当前循环引入额外的延迟,从而延迟虚拟键盘的响应能力?

linux epoll event-handling linux-device-driver uinput

5
推荐指数
1
解决办法
452
查看次数

使用operator []时std :: map segfaults

我有一个奇怪的问题.我正在使用工厂注册模式,它在内部引用std :: map.我正在将这种方法用于多个组件,并且在不同的编译单元(即.cpp文件)中的多个点处进行注册.这发生在静态变量初始化时(在调用'main'之前).出于一些奇怪的原因,我指的是一个段错误

map[key] = value;

(基本上当我注册一个特定的pfn时).现在,如果我在同一个编译单元中移动特定麻烦组件的注册,一切正常.再说一遍,如果我只撤回一个组件的注册,我会得到一个段错误.

我不得不说,这不是我第一次使用这种模式,它适用于其他组件的相同可执行文件(即,在初始化时没有问题的情况下,在另一个工厂类型的多个.cpp上传播的组件使用基本相似的源代码) .

我该怎么办?现在我已经将组件的注册保留在同一个.cpp中(并且它可以完美地工作).我怎样才能更好地调查?

我正在使用g ++(Ubuntu/Linaro 4.4.4-14ubuntu5)4.4.5

在stacktrace下面

0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
(gdb) bt
#0  0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
#1  0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- (
    this=0x7fffffffdff0) at /usr/include/c++/4.4/bits/stl_tree.h:199
#2  0x000000000041379d in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique (this=0x632a20, __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1179
#3  0x00000000004125f2 in std::_Rb_tree, std::allocator >, std::pair, …

c++ factory initialization stdmap segmentation-fault

3
推荐指数
1
解决办法
6018
查看次数

如何使用 VAO/VBO 为相同顶点指定多个 UV 坐标?

我现在的情况是想使用VAO/VBO来回收相同的顶点并使用索引来加速渲染。

一切都很好,除了我的纹理模型使用 UV 坐标,并且对于相同的顶点(大约 >80%),我最终可能会根据我期望渲染的三角形获得不同的 UV 坐标(事实上,我正在使用md2 模型和纹理)。

对于老式的即时模式来说,这种渲染方式非常不错。现在,解决这个问题并通过 VAO/VBO 渲染的最佳方法是什么?
我想到的是分解三角形并创建具有重复顶点的非常大的 VBO,以便我可以将正确的 UV 坐标链接到每个“相同”。

我不得不说我不喜欢这个...有什么想法吗?

诗。对于不了解格式的人:如果您想使用纹理映射,我相信您必须使用基于要渲染的三角形的自定义 UV 坐标。否则纹理颜色都乱了!

opengl vbo texture-mapping uv-mapping vao

2
推荐指数
1
解决办法
2440
查看次数