Tag: templates

C中只有一次伪通用标头

在对通用向量进行了一些工作后,我询问了这个问题 ,我想知道是否有任何方法可以检查每个类型的库的每个实例只进行一次。 这是当前头文件的样子: #ifndef VECTOR_GENERIC_MACROS #define VECTOR_GENERIC_MACROS #ifndef TOKENPASTE #define TOKENPASTE(a, b) a ## b #endif #define vector_t(T) TOKENPASTE(vector_t_, T) #define vector_at(T) TOKENPASTE(*vector_at_, T) #define vector_init(T) TOKENPASTE(vector_init_, T) #define vector_destroy(T) TOKENPASTE(vector_destroy_, T) #define vector_new(T) TOKENPASTE(vector_new_, T) #define vector_delete(T) TOKENPASTE(vector_delete_, T) #define vector_push_back(T) TOKENPASTE(vector_push_back_, T) #define vector_pop_back(T) TOKENPASTE(vector_pop_back_, T) #define vector_resize(T) TOKENPASTE(vector_resize_, T) #define vector_reserve(T) TOKENPASTE(vector_reserve_, […]

使用带有C结构的C ++模板进行内省?

我正在用C ++做一些其他用C语言编写的公司(使用C不是我的选项:()。它们有许多非常相似的数据结构(即它们都有字段)比如“名字”,“地址”等等。但是,无论出于何种原因,他们都没有一个共同的结构,以此为基础做任何其他事情(做任何事情)。无论如何,我需要做一个全系统的分析内存中的这些结构,并将它们全部放入表中。不是太糟糕,但表必须包含所有变量的所有字段的条目,即使它们没有字段(结构b可能)有字段“latency”,但struct a没有 – 在表中,a的每个实例的条目必须有一个“latency”的空条目。 所以,我的问题是,有没有办法在运行时确定传递给模板函数的结构是否具有特定字段? 或者我是否必须为我编写一些黑魔法宏? (问题基本上是我不能使用模板专业化) 谢谢! 如果您有任何疑问,请随时提出! 这是我在想什么的嗤之以鼻…… struct A { char name[256]; int index; float percision; }; struct B { int index; char name[256]; int latency; }; /* More annoying similar structs… note that all of the above are defined in files that were compiled as C – not C++ */ […]

GCC可以从最终输出中消除什么样的死代码?

我一直被告知编译器足以消除死代码。 我编写的大部分代码在编译时都知道很多信息,但代码必须以最通用的forms编写。 我不知道任何assembly,所以我无法检查生成的assembly。 什么样的代码可以在最终的可执行文件中有效消除? 几个例子但不限于 f(bool b){ if(b){ //some code }else{ //some code } } f(true); ////////////////////////// template f(){ if(b){ //some code }else{ //some code } } f(); /////////////////////////// 如果f定义在其他客观代码中并且被调用的f(true)在main中,那该怎么办? 链接时间优化会有效消除死代码吗? 什么是编码样式/编译器选项/技巧,以促进死代码消除?

编译器如何处理可变长度数组

这似乎是一个初学者的问题,但我对编译器通常创建变量维数组的方式感兴趣,就像在下面的程序中一样。 #include int main(){ int n; std::cin>>n; int a[n]; } 根据我所知,在C中,所有初始化值必须是常量,以便编译器知道在函数内保留多少内存,通常通过减去堆栈指针以容纳数组所包含的元素数量。 这对我来说很有意义。 但是,我不太明白编译器如何处理上述程序,因为它似乎与G ++(MinGW)一起工作,但是使用Cl,Microsoft的C ++编译器失败了。 我怀疑GCC通过非标准扩展在堆上分配内存,但我不确定。 此外,微软的编译器并不因标准兼容而闻名,所以如果它对待上述程序的方式实际上可能出错,我也不会感到惊讶。