小编Inb*_*ong的帖子

如何使模板化构造函数允许所有l值ref,r-value ref和initializer_list?

我正在尝试设计一个具有两个大序列向量的类.

std::vector<double> factory() {
    return std::vector<double>{1,2,3}; // it actually generates a large sequence of double
}

struct my_class {
    my_class(const std::vector<double>& x, const std::vector<double>& y)
     : m_x(x), m_y(y)
    { }

    std::vector<double> m_x;
    std::vector<double> m_y;
};

int main() {
    my_class c(factory(), factory());
    my_class c2(factory(), {0.5, 1, 1.5});
}
Run Code Online (Sandbox Code Playgroud)

好吧,它运行良好,但它不使用向量的移动构造函数.所以我试图改变构造函数以接受具有完美转发的r值引用.

struct my_class {
    template<typename X, typename Y>
    my_class(X&& x, Y&& y
             , typename std::enable_if<std::is_convertible<X, std::vector<double> >::value &&
                                       std::is_convertible<Y, std::vector<double> >::value>::type * = 0
            )
     : m_x(std::forward<X>(x)), m_y(std::forward<Y>(y))
    { }

    std::vector<double> m_x;
    std::vector<double> …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors rvalue-reference perfect-forwarding c++11

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

在GCC中静默忽略函数模板的section属性

我试图将一组特定的功能放入一个单独的部分,并且在使用GCC时遇到了麻烦.

namespace /* anonymous */ {
  [[gnu::section(".mysection")]]
  void regular_func() { }

  template <class T>
  [[gnu::section(".mysection")]]
  void template_func() { }
} // namespace /* anonymous */

void (*ptr1)() = &regular_func;
void (*ptr2)() = &template_func<int>;
Run Code Online (Sandbox Code Playgroud)

铿锵,两者的符号regular_func,并template_func<int>放置在.mysection如我所料.

$ clang++ -std=c++14 a.cpp -c && objdump -t a.o | grep -E "regular|template"
0000000000000000 l     F .mysection 0000000000000006 _ZN12_GLOBAL__N_112regular_funcEv
0000000000000010 l     F .mysection 0000000000000006 _ZN12_GLOBAL__N_113template_funcIiEEvv
Run Code Online (Sandbox Code Playgroud)

但是对于GCC,功能模板不会放在.mysection,而是放在.text.*部分中.

$ g++ -std=c++14 a.cpp -c && objdump -t a.o | …
Run Code Online (Sandbox Code Playgroud)

c++ attributes gcc c++11

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

在 arm 中使用 GCC 的内置函数

我正在使用没有 libc 的裸机工具链开发 cortex-m3 板。

我实现了 memcpy,它逐字节复制数据,但它太慢了。在 GCC 手册中,它说它提供了 __builtin_memcpy,我决定使用它。所以这里是 __builtin_memcpy 的实现。

#include <stddef.h>

void *memcpy(void *dest, const void *src, size_t n)
{
    return __builtin_memcpy(dest,src,n);
}
Run Code Online (Sandbox Code Playgroud)

当我编译这段代码时,它变成了一个永不结束的递归函数。

$ arm-none-eabi-gcc -march=armv7-m -mcpu=cortex-m3 -mtune=cortex-m3 \
  -O2 -ffreestanding -c memcpy.c -o memcpy.o
$ arm-none-eabi-objdump -d memcpy.o

memcpy.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <memcpy>:
   0:   f7ff bffe       b.w     0 <memcpy>
Run Code Online (Sandbox Code Playgroud)

我做错了吗?如何使用编译器生成的 memcpy 版本?

gcc arm built-in

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

C++:检查计算机是否已锁定

我正在试图弄清楚计算机是否已锁定.

我看过LockWorkStation的功能,但我希望找到的功能是IsWorkStationLocked.


我需要支持所有windows版本> = XP

c++ windows-xp windows-7

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

std :: vector <int,std :: allocator <char >>是否有效?

标准没有说明分配器,std::vector但只需要分配器来满足这个Allocator概念.没有关于allocator的value_type,没有reference_type,没有任何内容.

我认为std::vector<T, A>内部重新绑定A到分配器T,所以我给了一个向量std::allocator<char>,它按预期工作.

但是,如果std::allocator<void>给出GCC会产生错误,如下所示:

/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/ext/alloc_traits.h: In instantiation of ‘struct __gnu_cxx::__alloc_traits<std::allocator<void> >’:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/bits/stl_vector.h:75:28:   required from ‘struct std::_Vector_base<int, std::allocator<void> >’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/bits/stl_vector.h:214:11:   required from ‘class std::vector<int, std::allocator<void> >’
a.cpp:5:42:   required from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/ext/alloc_traits.h:109:53: error: forming reference to void
     typedef value_type&                             reference;
                                                 ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.2/include/g++-v4/ext/alloc_traits.h:110:53: error: forming reference to void
     typedef const value_type&                       const_reference;
                                                 ^
Run Code Online (Sandbox Code Playgroud)

这是GCC的错误吗?还是我误读标准?

  • GCC版本:4.9.2

c++ gcc vector allocator

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