小编Jos*_*vin的帖子

什么是C++终止处理程序Right Thing(TM)?

C++标准提供了一个std::set_terminate函数,它允许您指定std::terminate实际调用的函数.std::terminate应该只在严峻的情况下被调用,并且确定标准在被调用时所描述的情况是可怕的(例如未被捕获的异常).什么std::terminate时候被调用,这种情况似乎与失去记忆相似 - 你可以理智地做到这一点.

我已经读过它可以用来确保释放资源 - 但是对于大多数资源,这应该在进程退出时由OS自动处理(例如文件句柄).从理论上讲,我可以看到一个案例,如果说,你需要在退出时由于崩溃而向服务器发送特定的消息.但是OS操作的大部分时间应该足够了.

何时使用终止处理程序Right Thing(TM)?

更新:对使用自定义终止处理程序可以做什么感兴趣的人可能会发现这种非便携技巧很有用.

c++ resources standards exception-handling terminate

11
推荐指数
2
解决办法
3358
查看次数

自动化C++类的pimpl - 有一个简单的方法吗?

Pimpl是许多C++代码中的样板来源.它们似乎是宏,模板和一些外部工具帮助可以解决的组合,但我不确定最简单的方法是什么.我已经看到模板有助于完成一些提升但不是很多 - 你仍然需要为你试图包装的类的每个方法编写转发函数.有没有更简单的方法?

我正在想象一个用作制作过程一部分的工具.你希望你的公共标题是pimpl'd类,所以你提供一些输入文件,比如pimpl.in,列出你要包装的类(实现un-pimpl'd),然后检查该文件,生成pimpl类,并且在'make install'期间只安装它们的标题(不是原始类的标题).问题是如果没有完整的C++解析器,我没有看到任何方法可以做到这一点,甚至编译器供应商都无法做到这一点.也许这些类可以用某种方式编写,这使得外部工具的工作变得更容易,但我确信我最终会错过各种角落案例(例如模板化类和/或模板化成员函数).

有任何想法吗?有没有其他人为此问题提供解决方案?

c++ macros templates build-process pimpl-idiom

11
推荐指数
1
解决办法
1324
查看次数

在C++中,覆盖现有的虚函数会破坏ABI吗?

我的库有两个类,一个基类和一个派生类.在库的当前版本中,基类具有虚函数foo(),派生类不会覆盖它.在下一个版本中,我希望派生类可以覆盖它.这会破坏ABI吗?我知道引入一个新的虚函数通常会,但这似乎是一个特例.我的直觉是它应该改变vtbl中的偏移量,而不是实际改变表的大小.

显然,由于C++标准没有强制要求特定的ABI,这个问题在某种程度上是特定于平台的,但实际上,在大多数编译器中,断开和维护ABI是类似的.我对GCC的行为感兴趣,但是人们可以回答的编译器越多,这个问题就越有用;)

c++ virtual-functions backwards-compatibility abi subclassing

11
推荐指数
2
解决办法
1280
查看次数

是否有O(1)随机访问数据结构不依赖于连续存储?

经典的O(1)随机访问数据结构是数组.但是数组依赖于所使用的编程语言来支持有保证的连续内存分配(因为数组依赖于能够采用基类的简单偏移来找到任何元素).

这意味着语言必须具有关于内存是否连续的语义,而不是将其作为实现细节.因此,可能需要具有O(1)随机访问但不依赖于连续存储的数据结构.

有这样的事吗?

memory arrays algorithm complexity-theory data-structures

10
推荐指数
2
解决办法
5564
查看次数

如何在Python中将全局标记为已弃用?

我已经看到装饰器允许你标记一个不推荐使用的函数,以便在使用该函数时给出警告.我想对全局变量做同样的事情,但我想不出一种检测全局变量访问的方法.我知道globals()函数,我可以检查它的内容,但这只会告诉我是否定义了全局(如果该函数被弃用并且不是全部删除它仍将是它),如果它实际上被使用的话.我能想到的最佳选择是这样的:

# myglobal = 3
myglobal = DEPRECATED(3)
Run Code Online (Sandbox Code Playgroud)

但除了如何让DEPRECATED行为与'3'完全相同的问题之外,我不确定DEPRECATED可以做什么,这样可以让你每次访问时都能检测到.我认为它能做的最好就是遍历所有全局的方法(因为Python中的所有东西都是一个对象,所以即使'3'也有方法,转换为字符串之类的东西)和'装饰'它们都被弃用了.但那并不理想.

有任何想法吗?还有其他人解决过这个问题吗?

python hook global decorator deprecated

10
推荐指数
3
解决办法
5012
查看次数

如何为linux上的clone()系统调用mmap栈?

Linux上的clone()系统调用接受一个指向堆栈的参数,以供新创建的线程使用.显而易见的方法是简单地malloc一些空间并传递它,但是你必须确保你已经使用了大量的堆栈空间,因为该线程将使用(很难预测).

我记得在使用pthreads时我不必这样做,所以我很好奇它做了什么.我遇到了这个网站,它解释说,"Linux pthreads实现使用的最佳解决方案是使用mmap来分配内存,标志指定在使用时分配的内存区域.这样,内存分配给根据需要使用堆栈,如果系统无法分配额外的内存,则会发生分段违规."

我曾经听过mmap使用的唯一上下文是将文件映射到内存,实际上读取mmap手册页需要一个文件描述符.如何使用它来分配一堆动态长度来给clone()?这个网站真的很疯狂吗?;)

在任何一种情况下,内核都不需要知道如何为新堆栈找到一堆免费内存,因为在用户启动新进程时,它必须始终做什么?如果内核已经能够解决这个问题,为什么首先需要首先指定堆栈指针?

linux stack multithreading clone mmap

10
推荐指数
3
解决办法
5655
查看次数

为什么POSIX mmap没有返回volatile*?

Mmap返回void*,但不是a volatile void*.如果我使用mmap来映射共享内存,那么另一个进程可能正在写入该内存,这意味着来自同一内存位置的两个后续读取可能会产生不同的值 - 这是指volatile的确切情况.那么为什么它不会返回一个易变的空隙*?

我最好的猜测是,如果你有一个专门写入共享内存段的进程,它不需要通过volatile指针查看共享内存,因为它总能正确理解存在的内容; 编译器为防止冗余读取所做的任何优化都无关紧要,因为没有其他任何内容可以写入并更改其下的值.还是有其他一些历史原因?我倾向于说返回volatile void*将是一个更安全的默认值,那些想要进行优化的人可以手动转换为void*.

POSIX mmap说明:http://opengroup.org/onlinepubs/007908775/xsh/mmap.html

c posix pointers mmap volatile

10
推荐指数
3
解决办法
2541
查看次数

为什么系统调用返回EFAULT而不是发送段错误?

需要明确的是,这是一个设计而不是一个实现问题

我想知道POSIX为什么会这样做的理由.当给定无效的内存位置时,POSIX系统调用返回EFAULT而不是崩溃用户空间程序(通过发送sigsegv),这使得它们的行为与用户空间函数不一致.

为什么?这不是隐藏内存错误吗?这是一个历史错误还是有充分的理由呢?

c standards posix signals segmentation-fault

10
推荐指数
1
解决办法
1416
查看次数

为什么带有'直接'(O_DIRECT)标志的dd如此快得多?

我有一台服务器,RAID50配置为24个驱动器(两组12个),如果我运行:

dd if=/dev/zero of=ddfile2 bs=1M count=1953 oflag=direct
Run Code Online (Sandbox Code Playgroud)

我明白了:

2047868928 bytes (2.0 GB) copied, 0.805075 s, 2.5 GB/s
Run Code Online (Sandbox Code Playgroud)

但如果我跑:

dd if=/dev/zero of=ddfile2 bs=1M count=1953
Run Code Online (Sandbox Code Playgroud)

我明白了:

2047868928 bytes (2.0 GB) copied, 2.53489 s, 808 MB/s
Run Code Online (Sandbox Code Playgroud)

我知道O_DIRECT会导致页面缓存被绕过.但据我所知,它绕过页面缓存基本上意味着避免使用memcpy.使用带宽工具在我的桌面上进行测试我的最差情况是顺序内存写入带宽为14GB/s,我想在更新的更昂贵的服务器上,带宽必须更好.那么为什么额外的memcpy会导致> 2x减速?使用页面缓存时是否真的涉及更多内容?这不典型吗?

c linux io file dd

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

-symbolic和-shared GCC标志之间有什么区别?

从文档的描述中,他们似乎做了同样的事情,除了"并非所有系统"支持共享和"只有一些系统"支持符号(不清楚这些是否是同一组系统):

-shared生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件.并非所有系统都支持此选项.对于可预测的结果,还必须指定在指定此选项时用于生成代码(-fpic,-fPIC或模型子选项)的同一组选项.[1]

-symbolic在构建共享对象时绑定对全局符号的引用.警告任何未解决的引用(除非被链接编辑器选项-Xlinker -z -Xlinker defs覆盖).只有少数系统支持此选项.

我怀疑区别在于"生成一个共享对象,然后可以与其他对象链接以形成可执行文件"部分,但这听起来像任何库都是如此.是否意味着生成的共享对象也可以静态链接?

c gcc shared-libraries dynamic-linking compiler-flags

9
推荐指数
1
解决办法
3709
查看次数