我正在尝试设计一个具有两个大序列向量的类.
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
我试图将一组特定的功能放入一个单独的部分,并且在使用GCC时遇到了麻烦.
namespace /* anonymous */ {
[[gnu::section(".mysection")]]
void regular_func() { }
template <class T>
[[gnu::section(".mysection")]]
void template_func() { }
} // namespace /* anonymous */
void (*ptr1)() = ®ular_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) 我正在使用没有 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 版本?
标准没有说明分配器,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的错误吗?还是我误读标准?
c++ ×4
gcc ×3
c++11 ×2
allocator ×1
arm ×1
attributes ×1
built-in ×1
vector ×1
windows-7 ×1
windows-xp ×1