如标题中所述:
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上找到它或任何其他问题并提供详细的答案,所以我想我会问我希望能满足我的好奇心.
在此先感谢您的时间!
我正在阅读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)
但是,我对标准委员会决定对标准库标准进行修改的原因感兴趣吗?我试图谷歌的原因,但没有找到任何相关的东西.
我最近遇到了Dinkumware C++ 11 <regex>库的Stack Overflow问题,到目前为止,我已经通过将Stack Commit和Stack Reserve大小加倍来解决它(我还没有遇到任何问题).
但是,我很好奇增加堆栈大小是否有任何缺点,而且,我不完全确定堆栈提交和堆栈保留之间的区别是什么(但是堆栈提交比堆栈小得多)保留).
最近,我观看了来自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然后我们可以访问全局变量而无需额外的抽象级别?
此功能有哪些潜在用例?
自从thread在C++ 11中引入库以来,我一直在通过我的代码进行一些更改,将其从特定于平台的多线程代码转移到可移植的标准库代码.
但是,我很感兴趣标准库std::mutex和std::lock_guard<std::mutex>Win32特定的CMutex和CSingleLock.之间是否存在性能或功能差异.
我已经与剖析多线程代码没有经验,我不知道的任何两个互斥体类的内部,所以我不会甚至可以大胆的猜测.
我正在开展一个项目,我想接受表单的输入{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,所以我假设调用没有被优化掉.
我很感激任何帮助(或指导我误解/误读规范的地方!).
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++语言功能提议(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) 我对JavaScript比较熟悉,最近我被告知JavaScript数组包含一个length类型的变量Number.当数组更新为数组中的元素数时,此长度会自动更新.
但是,我也被告知在内部,JavaScript为其Number类使用64位浮点表示.我们知道浮点运算不能精确地表示其范围内的所有整数.
所以我的问题是,大型数组会发生什么,哪些length + 1不能完全代表序列中的下一个最大整数?
我试图编译以下小例子:
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 = 5用rank = sizeof(int)它替换编译并按预期工作,所以它似乎不是一个问题sizeof.
这是我的示范理念.
c++ ×9
c++11 ×4
c++14 ×2
performance ×2
templates ×2
arrays ×1
c++-amp ×1
javascript ×1
mutex ×1
openmp ×1
optimization ×1
ppl ×1
sal ×1
stack ×1
standards ×1
stl ×1
visual-c++ ×1
winapi ×1