我最近在Rust上阅读了很多,但我仍然只是开始氧化.我的大脑保留了大部分的C/C++反应,所以请原谅我这个问题是不相关的,因为Rust的工作方式如何.
通常是否可能(希望?)在堆上分配任意大小的块,然后在其上映射数据结构,并使用较小块内存的绑定?
使用C99,可以写这个:
typedef unsigned char BYTE;
typedef struct {
size_t size;
BYTE payload[];
} flex;
// ...
flex * flex_new(size_t _size) {
flex *f = malloc(sizeof(flex) + _size * sizeof(BYTE));
f->size = _size;
return f;
}
Run Code Online (Sandbox Code Playgroud)
灵活长度数组可能证明是有用的,例如在实现具有可变大小的块的内存池时或者在专用于线程的堆上分配内存时.需要大小的数据结构仅在运行时已知,以"原子"方式分配,其成员连续打包.
我想知道类似的Rust实现是否可行(没有unsafe构造),如果是,它看起来像什么.也许编译器可能会使用struct定义中的生命周期说明符来推断一些信息?
我已经嵌套了与VS 2015一起使用的部分专用模板代码,直到我发现它不符合标准.我希望它是如此,所以我扭曲了我的代码来克服前一个问题,而且那个问题现在已经发生了变化.
使用可变参数模板和部分特化我想在给定一组固定参数的情况下在编译时填充数组.
我想要达到的目标似乎与这个答案相似,但我没有设法让它发挥作用.
考虑以下程序:
#include <cstdlib>
template <typename T, std::size_t Size>
struct Array;
template <typename T, std::size_t Size, std::size_t Iteration, typename ...Args>
struct ArrayFiller {
inline
static void fill(Array<T, Size>& a, const Args&... args) {
ArrayFiller<T, Size, Iteration, Args...>::fill_recursive(a, args...);
}
inline
static void fill_recursive(Array<T, Size>& a, const T& i, const Args&... args) {
a.data[Size - Iteration - 1] = i;
ArrayFiller<T, Size, Iteration - 1>::fill_recursive(a, args...);
}
};
template <typename T, std::size_t …Run Code Online (Sandbox Code Playgroud) 请考虑以下程序:
\n\n#include <iostream>\n\n\ntemplate <int I, typename T, typename ...Args>\nstruct foo {\n static void bar(const T& t0, const T& t1, const Args&... args)\n {\n std::cout << "( " << t0 << ", " << t1 << " ) ";\n foo::bar(args...);\n }\n};\n\ntemplate <int I, typename T>\nstruct foo<I, T> {\n static void bar(const T& t0, const T& t1)\n {\n std::cout << "( "<< t0 << ", " << t1 << " ) " << std::endl;\n }\n};\n\n\nint main() {\n foo<1, int, float>::bar(0, 1, …Run Code Online (Sandbox Code Playgroud)