小编Dav*_*aim的帖子

为什么我要std :: move一个std :: shared_ptr?

我一直在查看Clang源代码,我找到了这个片段:

void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = std::move(Value);
}
Run Code Online (Sandbox Code Playgroud)

我为什么要std::move一个std::shared_ptr?

在共享资源上转移所有权是否有任何意义?

为什么我不这样做呢?

void CompilerInstance::setInvocation(
    std::shared_ptr<CompilerInvocation> Value) {
  Invocation = Value;
}
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers shared-ptr move-semantics c++11

133
推荐指数
6
解决办法
3万
查看次数

Thread类的onSpinWait()方法

在学习Java 9时,我遇到了一种新的Thread类方法,叫做onSpinWait?.根据javadocs,这个方法用于此:

表示调用者暂时无法进展,直到其他活动发生一个或多个操作为止.

有人能帮助我理解这种方法给出一个真实的例子吗?

java concurrency multithreading spinlock java-threads

29
推荐指数
4
解决办法
4117
查看次数

为什么C ++ 11使std :: string :: data()添加一个空终止符?

以前这是std::string::c_str()工作,但是从C ++ 11开始,data()它也提供了工作,为什么还要c_str()添加null终止字符std::string::data()?在我看来,这似乎是在浪费CPU周期,如果null终止字符根本不相关而仅data()使用,C ++ 03编译器就不必关心终止符,也不必每次调整字符串大小时,都必须向终止符写入0,但是由于data()-null-guarantee,C ++ 11编译器不得不浪费每次写入字符串大小时都要写入0的周期,因此,这可能会使代码变慢,我想他们有一定理由要添加该保证,那是什么?

c++ string stdstring c++11 c++03

29
推荐指数
3
解决办法
3267
查看次数

std :: async(std :: launch :: deferred)+ std :: future :: then的行为

延迟未来背后的想法(仅通过std::async使用std::launch::deferredflag 调用实现)是仅当有人试图等待或拉动未来的未来价值或例外时才调用回调.到那时,回调没有被执行.

如果我将续约延迟到延期的未来,会发生什么std::future::then?延迟的未来将丢失(then使未来无效),而是返回新的未来.

在这种情况下,根据标准,会发生什么?新的未来是一个延期的未来吗?会不会陷入僵局?最新文档中未解决此问题.

c++ concurrency stdasync c++17 std-future

21
推荐指数
1
解决办法
500
查看次数

我们可以检测 C++17 中的“琐碎可重定位性”吗?

在未来的 C++ 标准中,我们将拥有“琐碎可重定位性”的概念,这意味着我们可以简单地将字节从一个对象复制到未初始化的内存块,并简单地忽略/清零原始对象的字节。这样,我们就模仿了 C 风格的复制/移动对象的方式。

在未来的标准中,我们可能会有类似std::is_trivially_relocatable<type>类型特征的东西。目前,我们拥有的最接近的东西std::is_pod<type>将在 C++20 中弃用。

我的问题是,我们在当前标准(C++17)中是否有办法确定对象是否可以轻松重定位?例如,std::unique_ptr<type>可以通过将其字节复制到新的内存地址并将原始字节清零来移动,std::is_pod_v<std::unique_ptr<int>>但是false.

此外,当前的标准要求每个未初始化的内存块都必须通过构造函数才能被视为有效的 C++ 对象。即使我们能以某种方式弄清楚该对象是否可以轻松重定位,如果我们只是移动字节 - 根据标准它仍然是 UB。那么另一个问题是——即使我们可以检测到trivial relocatability,我们怎样才能在不引起UB的情况下实现trivial relocation呢?简单地调用memcpy + memset(src,0,...)并将内存地址转换为正确的类型就是 UB。`

谢谢!

c++ memory object type-traits c++17

7
推荐指数
2
解决办法
1674
查看次数

在 futex 系统调用中使用 std::atomic

在 C++20 中,我们能够在原子变量上休眠,等待它们的值改变。我们通过使用std::atomic::wait方法来做到这一点。

不幸的是,虽然wait已经标准化,wait_for而wait_until不是。这意味着我们不能在超时的原子变量上睡觉。

无论如何,使用 Windows上的WaitOnAddress和Linux 上的futex系统调用在幕后实现原子变量睡眠。

解决上述问题(无法在具有超时的原子变量上休眠),我可以在 Windows 上将内存地址传递std::atomic给 toWaitOnAddress并且它将(有点)在没有 UB 的情况下工作,因为该函数void*作为参数获取,并且强制转换std::atomic<type>为有效void*

在 Linux 上,不清楚是否可以std::atomic与futex. futex得到无论是uint32_t*或int32_t*(取决于你读这手册),铸造std::atomic<u/int>于u/int*为UB。另一方面,手册说

uaddr 参数指向 futex 字。 在所有平台上,futex 都是四字节整数,必须在四字节边界上对齐。在 futex_op 参数中指定要对 futex 执行的操作;val 是一个值,其含义和目的取决于 futex_op。

提示alignas(4) std::atomic<int>应该有效,只要类型具有 4 个字节的大小和 4 的对齐方式,它是哪种整数类型并不重要。

此外,我已经看到很多地方实现了这种结合原子和 futexes 的技巧,包括boost和TBB。

那么以非 …

c++ linux futex stdatomic c++20

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

我应该抛出异常吗?

我是C#程序员,但现在我想进一步学习C++.
我知道C++的基础知识,但我不知道如何处理错误.

例如:我正在写一个库.我创建了一个构造函数,它请求一个整数作为参数.
如果该整数大于50,则表示错误.在C#中我会抛出ArgumentOutOfRange异常,但是我应该在C++中做什么?

c++ error-handling exception

6
推荐指数
1
解决办法
524
查看次数

在 DLL 中隐藏 boost 函数

我正在处理一个 DLL 项目并且我正在使用 BOOST 库,我还使用了一个模块定义文件来避免编译器的名称修改,以便可以轻松地从这个 DLL 调用我的函数。但我的问题是很多 BOOST 功能区域也被导出。我正在使用 DLL 查看器查看我的 DLL 公开的函数,令我惊讶的是,那里有很多 BOOST。(我想导出的功能也在那里,所以没有问题)知道为什么会这样吗?(我没有足够的声誉来发布图片,有什么建议我可以这样做吗?pastebin 或其他什么?)

`GetNameOfUsbIf     Exported Function   
GetNumberOfUsbIfs   Exported Function   
Initialize          Exported Function   
int __stdcall SET_SYSTEM_NOTIFY_CALLBACK(void (__cdecl*)(enum SYSTEM_EVENT_MSP))        Exported Function   
private: static class boost::archive::detail::extra_detail::map<class boost::archive::binary_iarchive> & __cdecl boost::serialization::singleton<class boost::archive::detail::extra_detail::map<class boost::archive::binary_iarchive> >::get_instance(void)       Exported Function   
private: static class boost::archive::detail::extra_detail::map<class boost::archive::binary_iarchive> & boost::serialization::singleton<class boost::archive::detail::extra_detail::map<class boost::archive::binary_iarchive> >::instance     Exported Function`  
Run Code Online (Sandbox Code Playgroud)

我正在使用__declspec(dllexport)我希望导出的函数的前缀,该前缀由编译器标志控制。以上是 dllViewer 文本的复制粘贴 我缺少什么建议?

c++ dll boost

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

CPU 是否会在因 IO 读/写而阻塞的 java 线程上浪费时间?

如果一个线程在向 IO 写入数据时被阻塞,CPU 是否需要给该线程任何时间,直到该 IO 操作完成?

如果是这样,为什么CPU要放弃呢?

如果不是,除了“每个线程堆栈”之外,是否还有其他因素使得“每个线程请求”在重负载下的性能不如“共享线程的非阻塞 IO”?

PS:我已经阅读了很多关于这个主题的问题,但我找不到解决这个特定方面的答案

java io multithreading nonblocking

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

当我不需要返回任何东西时,“co_return”应该做什么?

我有一个具体的用例:

在我的库concurrencppmake_exceptional_lazy_result中,我想实现基本上类似于 C# 方法的功能Task.FromException。

在这个函数的实现内部,我总是会抛出异常,我永远不会得到co_return有效的对象。

我当前的实现如下所示:

template<class type, class exception_type>
lazy_result<type> make_exceptional_lazy_result(exception_type exception) {
    throw exception;
    co_return *static_cast<type*>(std::malloc(sizeof(type)));
}
Run Code Online (Sandbox Code Playgroud)

我对黑客行为感到恶心malloc——一方面,我必须做点什么co_return,另一方面,程序永远不会真正到达这条线。

我可以做得更好吗?我担心返回对未初始化的本地内存的引用(我不知道根据语言是否可以)。

我还可以在这里做哪些看起来更好的其他选择?请注意,它type不一定是默认可构造的,因此返回 atype{}不是一个选项。

c++ c++20 c++-coroutine

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