小编Chr*_*eck的帖子

`static_cast <volatile void>`对于优化器意味着什么?

当人们试图在各种库中执行严格的基准测试时,我有时会看到这样的代码:

auto std_start = std::chrono::steady_clock::now();
for (int i = 0; i < 10000; ++i)
  for (int j = 0; j < 10000; ++j)
    volatile const auto __attribute__((unused)) c = std_set.count(i + j);
auto std_stop = std::chrono::steady_clock::now();
Run Code Online (Sandbox Code Playgroud)

volatile在这里用来防止优化注意到,被测代码的结果被丢弃,并且然后丢弃整个计算.

当测试中的代码没有返回值时,说它是void do_something(int),那么有时候我会看到这样的代码:

auto std_start = std::chrono::steady_clock::now();
for (int i = 0; i < 10000; ++i)
  for (int j = 0; j < 10000; ++j)
    static_cast<volatile void> (do_something(i + j));
auto std_stop = std::chrono::steady_clock::now();
Run Code Online (Sandbox Code Playgroud)

这是正确用法volatile吗?什么是volatile void?从编译器和标准的角度来看,它意味着什么? …

c++ benchmarking volatile void microbenchmark

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

安全返回const和由const传递的对象?

使用clang-3.5编译以下代码到C++ 11标准时:

const String& XMLAttributes::getValueAsString(const String& attrName, const String& def) const
{
    return (exists(attrName)) ? getValue(attrName) : def;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

warning: 
  returning reference to local temporary object [-Wreturn-stack-address]
    return (exists(attrName)) ? getValue(attrName) : def;
                                                     ^~~
note: 
  binding reference variable 'def' here
  ...String& attrName, const String& def) const
                                 ^
1 warning generated.
Run Code Online (Sandbox Code Playgroud)

g ++ - 4.9没有给出类似的警告.

我的信念是clang过于热心,在这种情况下它应该可以工作,因为我知道当使用这个函数时,输入的寿命足够长.(我很确定我已经看到了大量的代码似乎以这种方式工作......)

我对clang说它是一个"本地临时对象"这一事实感到有点震惊.真的没什么应该有一个本地的临时对象,如果clang这么认为并且在这个函数运行时删除了东西,我想知道原因.

标准是否保证此函数返回的引用(在选择"def"的情况下)将与传入的引用具有相同的生命周期,或者是否允许它们被视为两个不同的引用不同的生命周期?

c++ pass-by-reference c++11

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

继承typedef?

我最近被一些代码示例搞糊涂了 - 有时看起来继承基类暴露的typedef有效,有时它似乎没有.

我的问题是

  • 它为什么不总是有效?
  • 它/将不会起作用的情况是什么?
  • 什么是不起作用的好的解决方法?

这是一些特定的代码:

// First example: Inheriting `static const int ...`
// Basic TypeList object
template<typename... Ts>
struct TypeList {
    static const int size = sizeof...(Ts);
};

// Repeat metafunction
template<typename T>
struct repeat;

template<typename... Ts>
struct repeat<TypeList<Ts...>> : TypeList<Ts..., Ts...> {};

// Checks
typedef TypeList<int, float, char> MyList;

static_assert(MyList::size == 3, "D:");
static_assert(repeat<MyList>::size == 6, "D:");


// Second example: Inheriting typedefs
// Meta function to compute a bundle of types
template <typename T>
struct …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates template-meta-programming c++11

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

TSQL只需要返回一个月的最后一天,如何删除年,月和时间?

我正在T-SQL中编写一个函数,无论日期输入如何,都会返回该月的最后一天.

这是我的代码:

Alter Function dbo.FN_Get_Last_Day_in_Month2
(@FN_InputDt    Datetime)
Returns smalldatetime
as 
Begin

Declare @Result  smalldatetime
Set    @Result =

       case when @FN_InputDt <> 01-01-1900 then 
       DATEADD(m, DATEDIFF(M, 0,@FN_InputDt)+1, -1)
       Else 0 End

Return @Result

End 
Run Code Online (Sandbox Code Playgroud)

代码无法正常工作,这是一个显示不良行为的测试:

SELECT dbo.fn_get_last_day_in_month (07-05-2010)
Run Code Online (Sandbox Code Playgroud)

这是(不正确的)结果:

2010-07-31 00:00:00
Run Code Online (Sandbox Code Playgroud)

t-sql datetime date sql-drop

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

为什么`std :: reference_wrapper`在c ++ 17中已弃用并在c ++ 20中被删除?

从C++ 11开始,它std::reference_wrapper是一个小的"垫片"模板,它是一种类型,可以从引用类型构造并转换为引用类型.它可以在通用容器中使用,否则可能不支持引用.

https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std :: reference_wrapper是一个类模板,它在可复制的可分配对象中包装引用.它经常被用作在标准容器(如std :: vector)中存储引用的机制,它通常不能保存引用.

此标准库功能在C++ 17中已弃用,并在当前的C++ 20草案中删除.为什么?

std::reference_wrapper以某种方式使用或有缺陷是不安全的吗?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r3.html#2.0中 ,似乎这部分被认为是"D.8旧适应性功能绑定"的一部分,标准描述中的文本在std::reference_wrapper"D.9.2 Typedef to Support Function Binders [depr.func.adaptor.typedefs]"部分中划掉

看来我们正在删除它,因为它在旧的函数绑定器API中扮演了一个角色,但它实际上在容器中有其他用途,如参考页面所述.是否有一些我遗漏的东西取代了那个用例,或者我错过了这种情况的其他东西?

如果要删除这个有用的功能,我们是否应该在需要时实现它,或者是否有某些原因导致整个模式不安全?

c++ c++11 reference-wrapper c++17 c++20

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