我已经看到了对C++中STL字符串的复制构造函数行为的各种冲突引用,我希望有人可以为我澄清这一点,给出以下代码段:
string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();
Run Code Online (Sandbox Code Playgroud)
对象''是否构成函数'str()'中定义的字符串对象的深层副本?或者是对象''简单地指向在'str()'函数中的字符串构造函数调用期间分配的同一块内存?
我最近从GTX480升级到GTX680,希望在我的CUDA代码中,三倍数量的内核会显示出显着的性能提升.令我惊恐的是,我发现我的内存密集型CUDA内核在GTX680上运行速度慢了30%-50%.
我意识到这不是一个严格的编程问题,但它确实直接影响了CUDA内核在不同设备上的性能.任何人都可以提供一些有关CUDA设备规格的信息,以及它们如何用于推断它们在CUDA C内核上的性能?
语境:我移植一个Linux Perl的应用C#,服务器监听UDP端口上,并通过一个单一的UDP套接字保持与远程客户端的多个并发的对话.在测试期间,我向udp服务器发送大量数据包,随机重启客户端以观察服务器注册新连接.问题是这样的:当我杀死一个udp客户端时,服务器上可能仍然存在发往该客户端的数据.当服务器尝试发送此数据时,它会返回icmp"无服务可用"消息,因此套接字上发生异常.
我不能再使用这个插座,当我尝试将C#异步处理器与插槽相关联,它抱怨例外,所以我必须关闭并重新打开服务器端口的UDP套接字.这是解决这个问题的唯一方法吗?肯定有一些"修复"udp套接字的方法,从技术上讲,UDP套接字不应该知道远程套接字的状态?
任何帮助或指针将不胜感激.谢谢.
我有一个OpenSSL生成的PEM格式的X.509证书和它的关联密钥文件.连接到原型服务器时,此证书是身份验证所必需的.这在Linux上运行良好.我一直在使用Microsoft SChannel API来驱动Windows平台上的SSL/TLS连接,但我想使用相同的测试证书.我可以右键单击证书文件并将其导入我的证书库,但我相信私钥不会随之导入(即使我已将它们连接到同一文件中).
当我去运行SChannel代码时,我在初始化安全上下文时(通过InitializeSecurityContext)收到'SEC_E_NO_CREDENTIALS'错误.我怀疑这意味着缺少私钥.
有谁知道如何测试位于个人(或"我的")证书存储区中的证书中是否存在私钥,通过'certmgr.msc'进行访问?是否可以在商店中导入证书的新密钥文件?
任何见解或建议将不胜感激.
上下文:我可以创建一个链接到静态库的共享对象库,在32位linux上没有任何问题.当我在64位linux上尝试相同的构建时,我看到了这个链接器错误:
这个错误在网上很常见.解决方案是使用位置无关代码(-fPIC)编译静态链接库.
我不明白为什么32bit版本不需要这样做.任何人都可以帮忙吗?
编辑:我已经恢复了原始标题,但实际上我应该问的是:'C++链接器如何处理已在多个目标文件中定义的类方法'
假设我在这些行的标题中定义了一个C++类:
class Klass
{
int Obnoxiously_Large_Method()
{
//many thousands of lines of code here
}
}
Run Code Online (Sandbox Code Playgroud)
如果我编译一些在几个位置使用'Obnoxiously_Large_Method'的C++代码,生成的目标文件是否总是内联'Obnoxiously_Large_Method'的代码,或者它是否会针对大小进行优化(例如,当使用g ++ -Os时)并创建单个实例'Obnoxiously_Large_Method'并像普通函数一样使用它?如果是这样,链接器如何解决已实例化相同函数的其他目标文件之间的冲突?是否存在一些神秘的C++命名空间Juju,它使方法的单独对象实例不会相互冲突?
我很好奇为什么允许匿名模板typename/class声明,如下所示:
template <typename, class, typename> struct TemplateTest1 { int a; float b ; } ;
TemplateTest1 <int, int, int> tt1 ;
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这些匿名类型的实用价值吗?它们会影响模板结构的表达吗?
谢谢.
我在增强的asio ssl实现中偶尔会出现通信故障,boost返回的超级有用的错误消息是'asio.ssl:336458004'
我怀疑数字图是由SSL标志组成的某种聚合结构,我说因为linux错误代码,boost asio错误代码和ssl错误代码没有任何对'336458004'的引用,所以大概是必须的动态构建.
任何人都可以提供一些有关如何解读此错误代码的见解吗?谢谢.
考虑这个类型推断的例子:
auto var = 1.0 ;
Run Code Online (Sandbox Code Playgroud)
这是否在C++ 11类型推断下评估为float还是double?,是否可以控制此行为?
我一直都知道C++的丰富抽象带来了一定的计算开销,但我的印象是,一旦应用了正确的编译器优化,这种开销几乎可以忽略不计.我很好奇这个开销的大小究竟是多少,所以我写了一个简单的测试来确定这一点.测试是一个模板化函数,它接受一个容器变量,为容器中的每个元素赋值,然后在一个单独的循环中对容器中的值求和.该过程重复预定的循环次数.
令我非常不安的是,我发现矢量实现几乎是标准阵列实现的3倍.在通过大量选择的编译器优化进行置换而没有任何成功之后,我决定咬紧牙关并直接观察汇编代码以尝试查看导致时间损失的原因.我包含了一些汇编指令,这些指令允许我精确地确定数组索引操作发生的位置并详细检查代码.令我完全困惑的是,我发现向量实现和数组实现之间的区别是完全无关紧要的.汇编代码可以在这里找到.
这是我用来构建二进制文件的命令:
g++ -O3 vectorArrayOp.cpp -o vectorArrayOp
Run Code Online (Sandbox Code Playgroud)
这是我用来构建程序集的命令:
g++ -O3 -DTAGASM vectorArrayOp.cpp -S -o vectorArrayOp.s
Run Code Online (Sandbox Code Playgroud)
这是我在运行二进制文件时观察到的输出:
gmurphy@interloper:Reference$ ./vectorArrayOp
Duration 0.027678
Duration 0.090212
Run Code Online (Sandbox Code Playgroud)
当您在stdout流中包含计算值时,结果不会更改,为清楚起见,我删除了它们.我的系统规格如下(我在AMD上也看到过相同的结果):
Linux 3.2.0-32-generic x86_64 GNU/Linux
Intel(R) Xeon(R) CPU X5550 @ 2.67GH
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)
代码如下,如果有人能够让我深入了解为什么在装配如此相似时时序如此不同,我将不胜感激.
#include <vector>
#include <iostream>
#include <sys/time.h>
#ifdef TAGASM
#define ASMTAG(X) asm(X)
#else
#define ASMTAG(X)
#endif
enum { DataSize=1024, NumTests=(1<<16) } ;
struct ReturnValue {ReturnValue(float _d, int _t):d(_d), t(_t){} float d; int t;} ;
template <typename Container, typename Type>
ReturnValue …Run Code Online (Sandbox Code Playgroud)