为什么这个程序调用复制构造函数而不是移动构造函数?
class Qwe {
public:
int x=0;
Qwe(int x) : x(x){}
Qwe(const Qwe& q) {
cout<<"copy ctor\n";
}
Qwe(Qwe&& q) {
cout<<"move ctor\n";
}
};
Qwe foo(int x) {
Qwe q=42;
Qwe e=32;
cout<<"return!!!\n";
return q.x > x ? q : e;
}
int main(void)
{
Qwe r = foo(50);
}
Run Code Online (Sandbox Code Playgroud)
结果是:
return!!!
copy ctor
Run Code Online (Sandbox Code Playgroud)
return q.x > x ? q : e;用于禁用nrvo.当我把它包起来时std::move,它确实被移动了.但是在"C++之旅"中,作者说当移动c'tor可用时必须调用它.
我做错了什么?
我用着色器绘制了一个圆圈,但我无法使用抗锯齿工作.
我试着在这里找到答案http://answers.unity3d.com/questions/521984/how-do-you-draw-2d-circles-and-primitives.html,但是我必须使用discard绘制圆圈.
这是我当前着色器结果和着色器代码的图片:

Shader "Unlit/CircleSeletor"
{
Properties
{
_BoundColor("Bound Color", Color) = (1,1,1,1)
_BgColor("Background Color", Color) = (1,1,1,1)
_MainTex("Albedo (RGB)", 2D) = "white" {}
_BoundWidth("BoundWidth", float) = 10
_ComponentWidth("ComponentWidth", float) = 100
}
SubShader{
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag Lambert alpha
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
sampler2D _MainTex;
float _BoundWidth;
fixed4 _BoundColor;
fixed4 _BgColor;
float _ComponentWidth;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; …Run Code Online (Sandbox Code Playgroud) 我有一个BizTalk WCF自定义接收位置,我已添加自定义行为:
public class SasTokenProviderEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(sharedAccessSecretName, sharedAccessKey);
bindingParameters.Add(new TransportClientEndpointBehavior { TokenProvider = tokenProvider });
}
}
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,省略了参数设置代码
这是根据https://code.msdn.microsoft.com/How-to-integrate-BizTalk-07fada58#content中的示例改编的- 该作者在BizTalk社区中受到广泛尊重,此类代码已被使用好几年了.我正在做的就是调整他使用的方法,这被证明有效,可以替换不同的TokenProvider.
我可以通过调试看到此代码运行并且具有正确参数的TransportClientEndpointBehavior被添加到通道中.但是,当BizTalk接收位置轮询Service Bus时,我在事件日志中看到以下内容:
适配器"WCF-Custom"引发了错误消息.详细信息"System.UnauthorizedAccessException:40102:缺少授权令牌,资源:sb:// [namespace] .servicebus.windows.net/[queue] .TrackingId:452c2534-d3e6-400f-874f-09be324e9e11_G27,SystemTracker:[namespace]. servicebus.windows.net:[queue],时间戳:12/1/2016 11:38:56 AM ---> System.ServiceModel.FaultException:40102:缺少授权令牌,资源:sb:// [namespace] .servicebus .windows.net/[queue] .TrackingId:452c2534-d3e6-400f-874f-09be324e9e11_G27,SystemTracker:[namespace] .servicebus.windows.net:[queue],时间戳:12/1/2016 11:38:56 AM
我看不出Azure Service Bus端点会返回此错误消息的任何原因,因为没有使用令牌提供程序.为什么频道会忽略TokenProvider,我必须做什么才能正确传递令牌?
编辑:
我已经检查了有问题的端口的原始WCF消息流量以及使用SB-Messaging适配器的流量,该适配器按预期工作.区别在于SB-Messaging适配器的消息包含SOAP标头,如:
<Authorization xmlns="http://schemas.microsoft.com/servicebus/2010/08/protocol/">SharedAccessSignature sr=[really long encoded string]</Authorization>而我的自定义绑定端口的消息没有.所以问题是缺少授权SOAP标头; 但问题仍然存在 - 为什么通道不添加此标题?
编辑#2:
我已经反编译了Microsoft.ServiceBus.dll,我相信我已经找到了实际创建WCF消息的类,Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageCreator.它有这个方法:
private Message CreateWcfMessageInternal(string action, object body, bool …Run Code Online (Sandbox Code Playgroud) 为什么foldl有时比foldr慢?我有一个列表"a"之类的
a = [[1],[2],[3]]
Run Code Online (Sandbox Code Playgroud)
并希望使用fold将其更改为列表
foldr (++) [] a
Run Code Online (Sandbox Code Playgroud)
它工作正常(时间复杂度为O(n)).但是,如果我使用foldl,它非常慢(时间复杂度为O(n ^ 2)).
foldl (++) [] a
Run Code Online (Sandbox Code Playgroud)
如果foldl只是从左侧折叠输入列表,
(([] ++ [1]) ++ [2]) ++ [3]
Run Code Online (Sandbox Code Playgroud)
和折叠是从右侧,
[1] ++ ([2] ++ ([3] ++ []))
Run Code Online (Sandbox Code Playgroud)
在两种情况下,计算次数(++)应该相同.为什么折叠这么慢?根据时间复杂度,foldl看起来好像扫描输入列表的次数是foldr的两倍.我用下面的电脑来计算时间
length $ fold (++) [] $ map (:[]) [1..N] (fold is either foldl or foldr)
Run Code Online (Sandbox Code Playgroud) 我是编程新手,目前正在使用Python。我正在学习的课程坚持要求我使用社区版本的 intellij。我有一台 i5 笔记本电脑,配备 8GB 内存。我什至没有在程序中输入任何内容,我实际上只是打开了它,干净的石板,它使用 686mb 的内存。我注意到,在输入简单的程序并通过运行不断检查程序后,它会占用大量内存。即使整机物理内存使用率不超过 50%。
我的机器开始停顿,就像鼠标暂停一样,程序没有最大化和最小化等。其他人也经历过这种情况吗?我能做些什么来减少内存使用吗?我实际上只想要 GUI 和纠错并且能够运行该程序,我不需要它似乎使用的所有其他东西。
我想将cv::SIFT描述符矩阵表示cv::Mat descriptors为float*。这是因为我想使用VLFeat 的 GMM(如果您有更好的解决方案,请告诉我)。这是我想出的代码:
if(!prova.isContinous()){
std::err<<"Descriptor matrix not continuous!"<<std::endl;
return 1;
}
float *data = new float[desc.total()];
std::memcpy(data,prova.data,prova.total() * sizeof(float));
Run Code Online (Sandbox Code Playgroud)
使用玩具矩阵尝试此代码:
cv::Mat prova = (cv::Mat_<float>(3,3) << 0.1, 0.3, 2.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8);
Run Code Online (Sandbox Code Playgroud)
并打印值:
for(int i=0;i<prova.total();i++)
std::cout<<*(data+i)<<std::endl;
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但由于我们正在处理指针(这总是一个危险的事情),我想听听意见。
注意:只是为了提供上下文,这就是我将要使用的方式data:
VlGMM* gmm = vl_gmm_new(VL_TYPE_FLOAT, desc.cols, 2) ;
vl_gmm_cluster (gmm, data, desc.rows);
Run Code Online (Sandbox Code Playgroud) 我无法理解C++ 11 std :: atomic_short行为的一部分.
我将0或255设置为atomic_short变量的值.
但.load()表示该值既不是0或255.
我想要一个线程来写原子变量,我希望另一个线程读取它.
环境:
Intel Core i5
OSX 10.11.6
clang(Xcode7.3.1)
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_short value = ATOMIC_VAR_INIT(0);
void process1() {
bool flag = false;
for (int i = 0; i < 100000; ++i){
std::this_thread::yield;
if (flag){
value.store(255);
} else {
value.store(0);
}
flag = !flag;
}
}
void process2() {
for (int i = 0; i < 100000; ++i){
std::this_thread::yield;
if (value.load() != 255 && value.load() != 0){
printf("warningA! %d\n", i);
} …Run Code Online (Sandbox Code Playgroud) 是否std::vector::pop_back设置它的对象的指针,nullptr或者它只是删除的对象?
我看到我的向量的大小减小了,所以对象显然被删除了,但我想知道指针是设置为nullptr还是必须手动执行?
编辑:我根据包含指针的向量提出了这个问题。例子:vector<Bitmap*>。