小编Olu*_*ide的帖子

编译器生成昂贵的MOVZX指令

我的探查器已将以下功能分析标识为热点.

typedef unsigned short ushort;

bool isInteriorTo( const std::vector<ushort>& point , const ushort* coord , const ushort dim )
{
    for( unsigned i = 0; i < dim; ++i )
    {
        if( point[i + 1] >= coord[i] ) return false;
    }

    return true;  
}
Run Code Online (Sandbox Code Playgroud)

特别是一个汇编指令MOVZX(Move with Zero-Extend)负责运行时的大部分.if语句被编译成

mov     rcx, QWORD PTR [rdi]
lea     r8d, [rax+1]
add     rsi, 2
movzx   r9d, WORD PTR [rsi-2]
mov     rax, r8
cmp     WORD PTR [rcx+r8*2], r9w
jae     .L5
Run Code Online (Sandbox Code Playgroud)

我想哄骗编译器生成这条指令,但我想我首先需要理解为什么生成这条指令.为什么扩展/零扩展,考虑到我使用相同的数据类型?

(在godbolt编译器资源管理器 …

c++ optimization assembly profiling

7
推荐指数
2
解决办法
2743
查看次数

C++模板模板参数的语法

我很难理解C++模板模板参数的语法.我理解它们为什么有用,根据这里的优秀描述,我发现它们的语法难以理解.以上网站的两个例子(还有其他):

template <typename T, template <typename> class Cont>
class Stack;
Run Code Online (Sandbox Code Playgroud)

template <template <typename,typename> class Cont>
class Wrapper3;
Run Code Online (Sandbox Code Playgroud)

如果不理解这种语法背后的基本原理,那么明确地概括这些声明是不可能的.记忆更难,似乎没有多大帮助.

编辑:我意识到我对某个问题的尝试就像观察一样.我要求的是如何在日常用语中解释模板模板参数语法.我可以用C++语法和我学到的所有其他编程语言来做到这一点.但是我很难向自己"解释"C++模板模板参数的语法.我收到了一本书,"C++模板:David Vandevoorde和Nicolai M. Josuttis的完整指南",虽然它是一本很好的书,但对我理解这种语法并没有多大帮助,我确信很多人会同意最好是古怪的.

c++ syntax templates

6
推荐指数
2
解决办法
1万
查看次数

使用(非类型)枚举参数定义内部类成员函数模板

我很难定义和专门update()化一个内部类的成员函数,该函数Outer<T1>::Inner在非类型(枚举)参数上进行模板化.

#include <cstdlib>

template<typename T1>
struct Outer
{
    struct Inner
    {
        enum Type{ A , B , C };

        template<Type T2>
        void update();
    };
};

// Definition
template<typename T1>
template<Outer<T1>::Inner::Type T2>
void Outer<T1>::Inner::update()
{
}

// Specialization
template<typename T1>
template<Outer<T1>::Inner::A >
void Outer<T1>::Inner::update()
{
}

int main()
{
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我在GCC 4.5.3中收到以下错误消息

prog.cpp:17:28: error: ‘Outer::Inner::Type’ is not a type
prog.cpp:18:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate …
Run Code Online (Sandbox Code Playgroud)

c++ templates inner-classes specialization non-type

6
推荐指数
1
解决办法
1341
查看次数

XML架构1.1中xs:redefine和xs:override之间的区别

XML架构1.1 <xs::redefine>和之间有什么区别<xs::override>.我面前有两本关于XML Schema的书籍,我仍然无法区分它们.我唯一确定的是两者都是普遍存在的并且已<xs::redefine>被弃用.

xml xsd redefinition xsd-1.1

6
推荐指数
1
解决办法
6607
查看次数

将预处理器宏 __FUNCTION__ 与字符串连接

这应该是微不足道的,但我似乎无法弄清楚如何连接__FUNCTION__字符串,尤其是在 GCC 上——尽管它适用于 VC++(我正在将一些代码移植到 Linux)

#include <iostream>
#include <string>

#define KLASS_NAME  "Global"

int main()
{
    std::string msg = KLASS_NAME "::" __FUNCTION__;
    std::cout << msg << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在线VC++版

GCC 错误信息

Test.cpp:9:36: error: expected ‘,’ or ‘;’ before ‘__FUNCTION__’
  std::string msg = KLASS_NAME "::" __FUNCTION__;
Run Code Online (Sandbox Code Playgroud)

更新

感谢 Chris,显然相邻的字符串文字被连接起来[reference]。所以在这种情况下 VC++ 可能是正确的,直到您认为这__FUNCTION__是非标准的。

c++ c-preprocessor c++03

6
推荐指数
1
解决办法
1451
查看次数

从标签的所有可能值的集合创建 Grafana 变量

我想创建一个 Grafana 变量/过滤器,其中包含regionmetric 上标签的所有可能值instance。列出这些值的查询是:

group by (region)(instance)
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我将此查询粘贴到 Grafana >> 变量 >> 查询选项 >> 查询时,出现错误

Validation
cannot parse parameter match[]
Run Code Online (Sandbox Code Playgroud)

Templating [region]
Error updating options: cannot parse parameter match[]
Run Code Online (Sandbox Code Playgroud)

grafana prometheus

6
推荐指数
1
解决办法
2万
查看次数

专门用于命名空间中的类的方法模板

我正在使用以下编译时'技巧'(基于ADL)来创建一个仅由同一名称空间中的类有效/定义/可调用的函数.

    namespace Family1
    {
        struct ModelA{};
        struct ModelB{};

        template<typename T>
        bool is_in_Family1(T const& t) 
        {
            return true;
        }
    };

    namespace Family2
    {
        struct ModelC{};

        template<typename T>
        bool is_in_Family2(T const& t) 
        {
            return true;
        }
    };


    Family1::ModelA mA;
    Family2::ModelC mC;

    is_in_Family1(mA);          // VALID
    is_in_Family1(mC);          // ERROR
Run Code Online (Sandbox Code Playgroud)

现在,我想使用这个原则(或类似的东西),以便Foo::Bar为属于每个命名空间的类产生(下面)的特化(例如)Family1.

    // I would like to specialize the method template Bar for classes in Family1 
    // namespace; and another specialization for classes in Family2 namespace
    struct Foo
    {
        template<typename T>
        void …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae

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

在XSD架构中定义XML元素的别名

是否有XSD语言支持或技巧(例如通过预处理器)来定义XML元素的别名?我想为我的模式中的所有元素添加别名,以便为更加神秘但网络带宽有效的XML文档版本创建一个选项.

例如,我想定义一个名称,例如作为IRQ元素的别名InterruptRequest等.

<xs:element name="InterruptRequest" minOccurs="0">
    <xs:complexType>
        <xs:attribute name="level" type="xs:unsignedShort" use="required"/>
    </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

这样以下两个声明就相互对应了

<!-- Human readable but bandwidth inefficient -->
<InterruptRequest level="22" /> 

<!-- Cryptic, but comparatively bandwidth efficient -->
<IRQ level="22" />
Run Code Online (Sandbox Code Playgroud)

xml alias xsd

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

初始化和访问可变参数类模板的成员

我正在尝试使用可变参数模板,并想知道它们是否可以用于通用(?)类模板,如

template<typename T1, typename T2 , typename T4, typename T4>
struct Foo
{
    T1      &m_member1;
    T2      &m_member2;
    T3      &m_member3;
    T4      &m_member4;
};
Run Code Online (Sandbox Code Playgroud)

此外,我希望能够通过链接构造函数来初始化所有成员.这是我得到了多远:

template<typename... Types>
struct Foo;

template<typename T , typename... Types>
struct Foo<T, Types ...> : public Foo<Types ...>
{
    Foo( T member , Types ... others ) : m_member( member ) , Foo<Types ...>( others )
    {
    }

    T   m_member;
};

template<typename T>
struct Foo<T>
{
    Foo( T member ) : m_member( member )
    {
    }

    T   m_member; …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-templates c++11

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

在FreeType中设置字符大小

我对设置字符大小对象的字符宽度和高度字段有点困惑(示例来自FreeType教程中描述的)

error = FT_Set_Char_Size(
          face,    /* handle to face object           */
          0,       /* char_width in 1/64th of points  */
          16*64,   /* char_height in 1/64th of points */
          300,     /* horizontal device resolution    */
          300 );   /* vertical device resolution      */
Run Code Online (Sandbox Code Playgroud)

为什么char_widthchar_height指定?那不应该取决于实际的字形吗?例如,字符“ w”和“ l”具有不同的宽度和高度。

另外,由于我没有渲染到屏幕上(我打算将光栅字体数据用于其他一些深奥的目的),而使用FT_Set_Pixel_Sizes是否足够?

freetype freetype2

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