Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

1
为什么用g ++编译该代码会花费这么长时间?
考虑以下代码: template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } 通过以下Bash命令(使用g ++ 8.3.0)对g ++编译进行基准测试时 for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null done 我得到以下输出: 1,0.03 2,0.03 …


4
使用非布尔返回值重载相等比较时,C ++ 20中的更改中断还是clang-trunk / gcc-trunk中的回归?
以下代码在c ++ 17模式下使用clang-trunk可以正常编译,但在c ++ 2a(即将到来的c ++ 20)模式下可以中断: // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() { Meta res = (Foo{} != Foo{}); } 它还可以使用gcc-trunk或clang-9.0.0进行编译:https : //godbolt.org/z/8GGT78 clang-trunk和错误-std=c++2a: <source>:12:19: error: use …


1
是string.assign(string.data(),5)定义明确的还是UB?
一位同事想这样写: std::string_view strip_whitespace(std::string_view sv); std::string line = "hello "; line = strip_whitespace(line); 我说过归来string_view使我先天不安,而且,在我看来,这里的别名看起来像UB。 我可以肯定地说line = strip_whitespace(line)在这种情况下等于line = std::string_view(line.data(), 5)。我相信will call string::operator=(const T&) [with T=string_view],其定义为等同于line.assign(const T&) [with T=string_view],其定义为等同于line.assign(line.data(), 5),定义为执行此操作: Preconditions: [s, s + n) is a valid range. Effects: Replaces the string controlled by *this with a copy of the range …

1
使std :: vector分配内存的现代方法
在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。 我正在尝试使对齐的内存对于SIMD正常工作,同时仍然可以访问所有数据。 在Intel上,如果创建类型为float的向量__m256,并将大小减小8倍,则会使内存对齐。 例如 std::vector<__m256> mvec_a((N*M)/8); 以一种有点怪异的方式,我可以将指向矢量元素的指针强制转换为float,这使我可以访问各个float值。 取而代之的是,我希望具有一个std::vector<float>正确对齐的,因此可以在__m256不进行段错误的情况下加载到其他SIMD类型中。 我一直在研究aligned_alloc。 这可以给我一个正确对齐的C样式数组: auto align_sz = static_cast<std::size_t> (32); float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float)); 但是我不确定如何执行此操作std::vector<float>。赋予std::vector<float>所有权marr_a 似乎是不可能的。 我已经看到一些建议,我应该编写一个自定义分配器,但这似乎需要大量工作,也许对于现代C ++,有更好的方法吗?

3
从函数返回唯一的空指针
要从void *CI中的函数获取a ,将执行以下操作(非常基本的示例): void *get_ptr(size_t size) { void *ptr = malloc(size); return ptr; } 使用时如何获得相同的结果std::unique_ptr<>?
11 c++  c  unique-ptr 


1
高效的字符串截断算法,顺序删除相等的前缀和后缀
每次测试的时间限制:5秒 每次测试的内存限制:512 MB 系统会为您提供一串s长度n(n≤5000)的字符串。您可以选择该字符串的任何适当前缀(也就是其后缀),然后删除所选的前缀或相应的后缀。然后,您可以对结果字符串应用类似的操作,依此类推。应用最佳操作顺序后,最终字符串的最小长度是多少? 输入 每个测试的第一行包含一个s由小英文字母组成的字符串。 输出 输出单个整数-最终字符串的最小长度,可以在应用此类操作的最佳顺序后实现。 例子 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc …

1
为什么在gcc的is_nothrow_constructible实现中需要static_cast?
取自GCC实施type_traits为什么static_cast在这里需要? template <typename _Tp, typename... _Args> struct __is_nt_constructible_impl : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {}; template <typename _Tp, typename _Arg> struct __is_nt_constructible_impl<_Tp, _Arg> : public integral_constant<bool, // Why is `static_cast` needed here? noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

3
如何找出编译器生成的函数?
我知道编译器生成的函数,三个规则和五个规则。在实际情况下,准确地找出编译器实际创建了哪些编译器生成的函数(构造函数,赋值运算符,析构函数)可能并不容易。 有什么方法可以列出特定类的编译器生成的函数吗? 我主要对Visual Studio 2019和Xcode感兴趣,但是更欢迎使用通用解决方案。
11 c++  c++11 

1
不合格的sort()—为什么在std :: vector而不是std :: array上使用时会编译,并且哪个编译器正确?
呼叫std::sort()时std::array: #include <vector> #include <array> #include <algorithm> int main() { std::vector<int> foo{4, 1, 2, 3}; sort(begin(foo), end(foo)); std::array<int, 4> foo2{4, 1, 2, 3}; sort(begin(foo2), end(foo2)); } gcc和clang都在std::array--clang说的排序上返回错误 错误:使用未声明的标识符“ sort”;您是说'std :: sort'吗? 进行更改以std::sort(begin(foo2), end(foo2))解决问题。 MSVC按照编写的方式编译上面的代码。 std::vector和之间为什么区别对待std::array; 哪个编译器正确?
11 c++  c++17 

2
如何找到C ++伪复制操作?
最近,我有以下 struct data { std::vector<int> V; }; data get_vector(int n) { std::vector<int> V(n,0); return {V}; } 此代码的问题在于,当创建该结构时,会发生复制,而解决方案是写return {std :: move(V)} 是否有lint或代码分析器可以检测到这种虚假的复制操作?cppcheck,cpplint或clang-tidy都无法做到这一点。 编辑:几点使我的问题更清楚: 我知道发生了复制操作,因为我使用了编译器浏览器,并且显示了对memcpy的调用。 通过查看标准yes,我可以确定发生了复制操作。但是我最初的错误想法是编译器将优化此副本。我错了。 这(可能)不是编译器问题,因为clang和gcc都产生产生memcpy的代码。 memcpy可能很便宜,但我无法想象在比复制std :: move指针更便宜的情况下,复制内存和删除原始内存是比较便宜的。 std :: move的添加是基本操作。我可以想象一个代码分析器将能够建议这种纠正。

2
T是否必须是要在`std :: declval <T>`中使用的完整类型?
考虑以下示例(来自此处): #include &lt;type_traits&gt; #include &lt;iostream&gt; template &lt;typename U&gt; struct A { }; struct B { template &lt;typename F = int&gt; A&lt;F&gt; f() { return A&lt;F&gt;{}; } using default_return_type = decltype(std::declval&lt;B&gt;().f()); }; int main() { B::default_return_type x{}; std::cout &lt;&lt; std::is_same&lt; B::default_return_type, A&lt;int&gt;&gt;::value; } 它在gcc9.2上编译时没有错误,但gcc7.2和clang 10.0.0抱怨B未完成。lang的错误是: prog.cc:11:58: error: member access into incomplete …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.