小编Tho*_*ell的帖子

SAL(源注释语言)的目的是什么,SAL 1和2之间有什么区别?

如标题中所述:

SAL(源注释语言)的目的是什么?SAL 1和SAL 2之间有什么区别?

我理解使用的基础知识,这有助于突出传递给函数的每个变量的目的以及静态代码分析的各种其他内容,但它实际上有多大差异(忽略了参数要求的增加清晰度)该项目的其他程序员)?

如果我有以下原型:

_Success_(return == 1) 
int TestFunction( _In_ int* pTest, _Inopt_ char* pOptional );
Run Code Online (Sandbox Code Playgroud)

这应该"告诉"静态分析器该函数在成功操作时将返回1,这pTest是一个必须不是指针,nullptr而且pOptional指针可能是也可能不是nullptr.但是,静态分析器不能从函数定义本身获取此信息吗?此外,它如何处理获得的信息,例如成功标准?

此外,为什么会出现SAL 1和SAL 2,为什么微软决定改变他们命名了他们的宏的方式之间的差异(即从__out_Out___success_Success_?)

我很抱歉,如果在MSDN上详细描述了这一点,但我无法在StackOverflow上找到它或任何其他问题并提供详细的答案,所以我想我会问我希望能满足我的好奇心.

在此先感谢您的时间!

c++ visual-studio microsoft-sal sal

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

为什么std :: pair类标准被改为禁止在C++ 11中只有非常量复制构造函数的类型?

我正在阅读Nicolai M. Josuttis的"The C++标准库(第二版)"并刚刚进入了该部分std::pair.作者指出:

从C++ 11开始,pair<>使用只有非常量复制构造函数的类型将不再编译.

然后他继续给出以下示例:

class A 
{
   public:
     ...
     A( A& ); // copy constructor with nonconstant reference
     ...
};

std::pair<A, int> p; // Error since C++11
Run Code Online (Sandbox Code Playgroud)

但是,我对标准委员会决定对标准库标准进行修改的原因感兴趣吗?我试图谷歌的原因,但没有找到任何相关的东西.

c++ copy-constructor move-semantics c++11

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

堆栈大小增加的缺点以及堆栈提交和保留之间的差异

我最近遇到了Dinkumware C++ 11 <regex>库的Stack Overflow问题,到目前为止,我已经通过将Stack Commit和Stack Reserve大小加倍来解决它(我还没有遇到任何问题).

但是,我很好奇增加堆栈大小是否有任何缺点,而且,我不完全确定堆栈提交和堆栈保留之间的区别是什么(但是堆栈提交比堆栈小得多)保留).

c++ performance stack c++11

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

何时将全局变量的地址作为模板参数传递有用?

最近,我观看了来自Microsoft的一段视频,解释了C ++ 17的一些新功能,我很感兴趣地找到了C ++ 14的功能(甚至可能在此之前?),它允许您使用全局地址。变量作为模板参数的常量表达式。

这允许如下代码:

#include <iostream>
int g_iTest = 5;

template <int* Addr>
struct S {
    static int TestAdd( int iTest ) {
         *Addr = iTest + *Addr;
         return *Addr;
    }
};

int main() {
    S<&g_iTest> s;
    std::cout << s.TestAdd( 5 ) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这将导致输出10。就目前而言,这对我来说是一种有趣的语言特性,但是,视频中的那个人强调说,这是一个有用的功能,已用于减少传递全局变量时的代码膨胀。但是,我不明白它是如何工作的,因为我们肯定可以只有一个头文件,extern int g_iTest然后我们可以访问全局变量而无需额外的抽象级别?

此功能有哪些潜在用例?

c++ optimization templates c++14

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

Win32 CMutex和标准库std :: mutex的比较

自从thread在C++ 11中引入库以来,我一直在通过我的代码进行一些更改,将其从特定于平台的多线程代码转移到可移植的标准库代码.

但是,我很感兴趣标准库std::mutexstd::lock_guard<std::mutex>Win32特定的CMutexCSingleLock.之间是否存在性能或功能差异.

我已经与剖析多线程代码没有经验,我不知道的任何两个互斥体类的内部,所以我不会甚至可以大胆的猜测.

c++ winapi mutex standard-library c++11

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

为什么std :: stof在传递参数时不会抛出它无法转换?

我正在开展一个项目,我想接受表单的输入{float}{single-letter-identifier},例如15.6E,或10W.

为此,我认为我可以取输入字符串,去除最后一个字母,然后检查是否可以执行转换以进行浮动,使用std::stof.这将嵌套在一个try-catch块中,并允许我通知用户无效输入.

在STL的开放标准在这里(页653)指出std::stof抛出:

invalid_argument 如果wcstod或wcstold报告无法执行转换.

但是,当传递无法转换的内容时,它不会抛出,例如"48East".重现此行为的代码示例如下:

std::wstring szString = L"48East";
try{
     float f = std::stof(szString);
} catch( ... )
{
     std::cout << "test" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这是在调试模式下在MSVC10上编译的/Od,所以我假设调用没有被优化掉.

我很感激任何帮助(或指导我误解/误读规范的地方!).

c++ stl visual-c++

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

Why is PPL significantly slower than sequential loop and OpenMP in this case

Further to my question on CodeReview, I am wondering why the PPL implementation of a simple transform of two vectors using std::plus<int> was so much slower than the sequential std::transform and using a for loop with OpenMP (sequential (with vectorization): 25ms, sequential (without vectorization): 28ms, C++AMP: 131ms, PPL: 51ms, OpenMP: 24ms).

我使用以下代码进行分析并在 Visual Studio 2013 中使用完全优化进行编译:

#include <amp.h>
#include <iostream>
#include <numeric>
#include <random>
#include <assert.h>
#include <functional>
#include <chrono>

using namespace concurrency;

const std::size_t size = 30737418;

//---------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

c++ performance openmp c++-amp ppl

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

固定大小参数包的状态

我目前对固定大小参数包C++语言功能提议(n4072)的进展感到好奇.此功能允许以下内容是有效的C++语法:

void Foo( int...[10] iList );
Run Code Online (Sandbox Code Playgroud)

这将允许各种有用的模板元编程特征.我的主要原因是因为我正在创建一个库类,它表示具有任意等级的数学Tensor对象.

这将允许我在索引类时执行以下操作:

template <typename T, std::size_t... Sizes>
class CTensor {
      // ...
public:
     NumType& operator()( std::size_t...[sizeof...(Sizes)] coords ) 
     {
          // Return reference to element at the position specified
          // by coords.
     }
};
Run Code Online (Sandbox Code Playgroud)

并通过以下方式调用它:

CTensor<int, 3, 4, 5> tensor;
/* tensor( 1, 2, 3, 4 ) = 5; // Results in a descriptive compile-time error */
tensor( 1, 2, 3 ) = 5; // Sets the element at (1, 2, 3) to …
Run Code Online (Sandbox Code Playgroud)

c++ standards c++14

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

它们变得非常庞大时,JavaScript数组中的浮点精度会丢失吗?

我对JavaScript比较熟悉,最近我被告知JavaScript数组包含一个length类型的变量Number.当数组更新为数组中的元素数时,此长度会自动更新.

但是,我也被告知在内部,JavaScript为其Number类使用64位浮点表示.我们知道浮点运算不能精确地表示其范围内的所有整数.

所以我的问题是,大型数组会发生什么,哪些length + 1不能完全代表序列中的下一个最大整数?

javascript arrays floating-point

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

为什么以下非静态数据成员初始化在C++ 11中无效

我试图编译以下小例子:

template <typename T, std::size_t... Sizes>
class Foo {
public:
     const std::size_t    rank = sizeof...(Sizes);
     const std::size_t    dimensions[sizeof...(Sizes)] = { Sizes... };
};

int main()
{
    Foo<int, 1, 2, 3> foo;

    std::cout << "Rank: " << foo.rank << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它没有编译与gcc-4.8.1抱怨;成员声明结束时缺乏和...令牌前缺乏预期的不合格ID .但是,如果我用以下内容替换这两个成员,它将按预期编译并工作:

const std::size_t     rank = 5;
const std::size_t     dimensions[5] = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用sizeof...Sizes...作为编译时常量,肯定两者都是在编译时已知和评估的,因此可以用于非静态数据成员初始化?此外,如果我rank = 5rank = sizeof(int)它替换编译并按预期工作,所以它似乎不是一个问题sizeof.


这是我的示范理念.

c++ templates initialization variadic-templates c++11

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