草庐IT

交换两数

全部标签

c++ - 使用 gcc 原子内置函数的原子交换函数

这是通用原子交换函数的正确实现吗?我正在GCC上寻找与C++03兼容的解决方案。templatevoidatomic_swap(T&a,T&b){static_assert(sizeof(T)如果不是,我应该怎么做才能修复它?此外:__sync_lock_release是否总是必需的?在搜索其他代码库时,我发现这通常不会被调用。没有发布调用,我的代码如下所示:templatevoidatomic_swap(T&a,T&b){static_assert(sizeof(T)附言:AtomicswapinGNUC++是一个类似的问题,但它没有回答我的问题,因为提供的答案需要C++11的std

c++ - 将 std::unique_ptr 与 lambda 交换为删除器——GCC

我们可以使用lambda作为带有std::unique_ptr的删除器吗?实际上,我是用clang++做的,它很高兴这样做。我正在使用std::swap换成std::unique_ptr;其中autodeleter=[](structaddrinfo*ptr){if(ptr!=nullptr){freeaddrinfo(ptr);}};.Clang的交换似乎不需要复制赋值运算符,但gcc的std::swap需要,正如您在这些日志中看到的那样:Infileincludedfrom/usr/include/c++/4.8.1/memory:81:0,from/home/zenol/proj

c++ - 为什么 std::swap 不使用交换习语?

正确使用std::swap是:usingstd::swap;swap(a,b);它有点冗长,但它确保如果a、b有更好的交换定义,它就会被选中。所以现在我的问题是,为什么std::swap没有使用这种技术实现,所以用户代码只需要调用std::swap?所以像这样(忽略noexcept和为简洁起见的限制):namespacestd{namespaceinternal{template//normalswapimplementationvoidswap(T&a,T&b){//notintendedtobecalleddirectlyTtmp=std::move(a);a=std::move(

java - 为什么用 xor 交换在 C++ 中工作正常,但在 Java 中却不行?一些难题

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:Whyisthisstatementnotworkinginjavax^=y^=x^=y;示例代码inta=3;intb=4;a^=(b^=(a^=b));在C++中它交换变量,但在Java中我们得到a=0,b=4为什么?

c++ - C++中的比较和交换

所以我们使用的是目前相当旧的bo​​ost版本,在升级之前我需要为我的代码在C++中进行原子CAS操作。(我们也没有使用C++0x)我创建了以下cas函数:inlineuint32_tCAS(volatileuint32_t*mem,uint32_twith,uint32_tcmp){uint32_tprev=cmp;//ThisversionbyMansRullgardofPathscale__asm____volatile__("lock\n\t""cmpxchg%2,%0":"+m"(*mem),"+a"(prev):"r"(with):"cc");returnprev;}我使用

c++ - 在 C++11 中以无锁方式原子交换两个 std::atomic<T*> 对象?

以下代码是从PARSECbenchmarksuiteforshared-memorymultiprocessors中的模拟退火应用程序中提取的原子指针类的框架。.在该应用程序中,中央数据结构是一个图形(更具体地说,是集成电路的网表)。图中的每个节点都有一个指示其物理位置的属性。该算法产生许多线程,每个线程重复并随机选择两个节点并交换它们的物理位置,如果这样可以为芯片带来更好的路由成本。由于图很大,每个线程都可以选择任意一对节点,唯一可行的解​​决方案是无锁并发数据结构(CDS)。这就是为什么以下AtomicPtr类是至关重要的(它用于以无锁方式自动交换指向两个物理位置对象的指针)。函数

c++ - 为什么基于指针交换两个值在函数范围之外不起作用?

我已经很多年没有用C++编程了,所以我决定重温一下指针的内存。经典的两个数交换的例子,例子是voidswapPointersClassic(double*num1,double*num2){doubletemp;temp=*num1;*num1=*num2;*num2=temp;}这允许我们像swapPointersClassic(&foo,&bar);一样调用函数,因为我们传入了变量foo和bar的内存地址,函数将检索值并进行交换.但我开始怀疑,为什么我不能执行以下操作?voidswapPointers(double*num1,double*num2){double*temp;tem

燕山大学计算机网络实验(windows网络配置方法及基本网络命令、交换机和路由器的使用、小型校园网络模拟搭建)

项目源码以及报告获取,可看我专栏简介实验1windows网络配置方法及基本网络命令1.1实验内容和要求1、查看本机网络配置,根据配置信息,把本机地址改为静态地址,并使用ipconfig、ping命令验证网络状态,如果网络不通请根据相关现象测试,并给出自己的推论和思考。(请使用自己的笔记本连接校园网无线进行操作)2、在本机网络畅通情况下,使用ipconfig、tracert、arp、netstat命令查看本机网络信息并解释,要求常用参数都要使用上。实验2交换机和路由器的使用2.1实验内容和要求自己设计并实现:使用三层交换机连接两台二层交换机,每台二层交换机上连接2台pc,pc属于两个不同的vla

c++ - 为什么 valarray 没有像 C++03 中的 vector 那样的交换函数?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。如标题,我对此感到困惑。如果我们面临迭代问题,swap应该非常有用。可以通过交换指向内存的指针而不是内容来交换旧vector和新vector。但是,这在std::vector中有效,但在std::valarray中无效。我想知道为什么。C++0x好像加了这个函数,为什么C++03没有?

c++ - std::vector 在增长时是否调用交换函数?始终还是仅针对某些类型?

据我所知,我可以使用vector的vector(std::vector>),这将非常有效,因为在内部不会复制元素,而是交换元素,这要快得多,因为不包括复制内存缓冲区。我说得对吗?什么时候std::vector究竟利用交换功能?我在C++standard中找不到任何相关信息.它是否发生在缓冲区重新分配期间?我做了一些测试来找出它,但我失败了。我的自定义数据类型的交换函数根本没有被调用。编辑:这是我的testprogram. 最佳答案 我没有链接来支持这种说法,但据我所知,随MicrosoftC++分发的STL实现使用一些内部非标准魔术