小编Jul*_*rcq的帖子

按值复制而不是移动

为什么这个程序调用复制构造函数而不是移动构造函数?

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可用时必须调用它.

我做错了什么?

c++ c++11

14
推荐指数
1
解决办法
1290
查看次数

如何通过着色器和抗锯齿来统一绘制圆圈

我用着色器绘制了一个圆圈,但我无法使用抗锯齿工作.

我试着在这里找到答案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)

shader antialiasing unity-game-engine

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

为什么WCF会忽略我的TokenProvider?

我有一个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)

wcf biztalk azureservicebus azure-servicebus-queues

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

foldl with(++)比foldr慢很多

为什么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)

haskell

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

IntelliJ IDEA 使用过多内存

我是编程新手,目前正在使用Python。我正在学习的课程坚持要求我使用社区版本的 intellij。我有一台 i5 笔记本电脑,配备 8GB 内存。我什至没有在程序中输入任何内容,我实际上只是打开了它,干净的石板,它使用 686mb 的内存。我注意到,在输入简单的程序并通过运行不断检查程序后,它会占用大量内存。即使整机物理内存使用率不超过 50%。

我的机器开始停顿,就像鼠标暂停一样,程序没有最大化和最小化等。其他人也经历过这种情况吗?我能做些什么来减少内存使用吗?我实际上只想要 GUI 和纠错并且能够运行该程序,我不需要它似乎使用的所有其他东西。

intellij-idea

4
推荐指数
1
解决办法
4150
查看次数

如何将 cv::Mat 转换为浮点指针?

我想将cv::SIFT描述符矩阵表示cv::Mat descriptorsfloat*。这是因为我想使用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 c++ opencv memcpy vlfeat

3
推荐指数
1
解决办法
7933
查看次数

我无法理解奇怪的std :: atomic_short.load()行为

我无法理解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)

c++ c++11

3
推荐指数
1
解决办法
116
查看次数

std::vector::pop_back 是否将其中的对象指针设置为 nullptr?

是否std::vector::pop_back设置它的对象的指针,nullptr或者它只是删除的对象?

我看到我的向量的大小减小了,所以对象显然被删除了,但我想知道指针是设置为nullptr还是必须手动执行?

编辑:我根据包含指针的向量提出了这个问题。例子:vector<Bitmap*>

c++ stdvector nullptr

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