小编Ash*_*Ash的帖子

快速C++代表

我知道以下C++代理方法:

.与纯虚函数的接口
.Boost.Function
.最快可能的C++代表
.不可能快速的C++代表
.快速C++代表
.Fast C++ Delegate:Boost.Function'drop-in'替换和多播

每个都有其优点和缺点.有些更快,有些更灵活,有些更丰富,有些更符合标准,有些更便携,但我个人觉得自己喜欢第三种:Sergey Ryazanov的不可能快速的C++代表.但问题是他的代表不具备可比性:

我的代表无法比较.未定义比较运算符,因为委托不包含指向方法的指针.存根函数的指针在各种编译单元中可以不同.

读者回答了哪一个:

"在各种编译单元中,指向存根函数的指针可能不同." AFAIK,这不是真的.编译器需要重复使用在不同编译单元中生成的模板函数(我确信 - 但我认为Borland曾违反此规则).我认为这是因为类(不在"无名"命名空间中)使用外部链接,并且使用存根函数的方式总是会阻止它们被内联(尽管这不应该是一个问题,因为它取了函数的地址将强制生成非内联版本,并且链接器执行的"外部链接"将消除除一个类似命名的函数之外的所有函数(假定它们并且标准要求它们相同))...

如果您定义一个转换单元(cpp文件)的模板函数,然后在另一个转换单元中以不同方式定义相同的函数,则两个版本中只有一个将使其成为最终的可执行文件.(这实际上违反了"一个定义规则",但适用于GCC,至少......不确定MSVC.)重点是:[存根]的地址在不同的单位中是相同的.

如果您发现MSVC属实,我会敦促您更新文章(包括比较功能) - 如果MSVC是标准授权,就此而言.

现在这篇文章已有四年了,作者在过去三年左右没有回复任何评论,所以我想知道上述评论是否有任何优点,以及这个具体实施是否确实可以改为支持比较.C++标准是否明确禁止此类使用?如果是这样,那么最近的编译器是否在这方面符合标准?

谢谢.

c++ delegates one-definition-rule language-lawyer

19
推荐指数
1
解决办法
7544
查看次数

关于智能指针的一个问题及其必然的非决定论

在过去的两年里,我一直在我的项目中广泛使用智能指针(boost :: shared_ptr).我理解并欣赏他们的好处,我一般都喜欢他们.但是我越是使用它们,我就越想念C++的确定性行为,关于内存管理和RAII,我似乎更喜欢编程语言.智能指针简化了内存管理的过程并提供了自动垃圾收集等功能,但问题是一般使用自动垃圾收集和智能指针特别引入了(de)初始化顺序的某种程度的不确定性.这种不确定性使控制权远离程序员,并且正如我最近意识到的那样,它完成了设计和开发API的工作,

为了详细说明,我目前正在开发一个API.此API的某些部分要求在其他对象之前初始化或销毁某些对象.换句话说,(de)初始化的顺序有时很重要.举个简单的例子,假设我们有一个名为System的类.系统提供一些基本功能(在我们的示例中记录)并通过智能指针保存许多子系统.

class System {
public:
    boost::shared_ptr< Subsystem > GetSubsystem( unsigned int index ) {
        assert( index < mSubsystems.size() );
        return mSubsystems[ index ];
    }

    void LogMessage( const std::string& message ) {
        std::cout << message << std::endl;
    }

private:
    typedef std::vector< boost::shared_ptr< Subsystem > > SubsystemList;
    SubsystemList mSubsystems;    
};

class Subsystem {
public:
    Subsystem( System* pParentSystem )
         : mpParentSystem( pParentSystem ) {
    }

    ~Subsystem() {
         pParentSubsystem->LogMessage( "Destroying..." );
         // Destroy this subsystem: deallocate memory, release resource, etc.             
    } …
Run Code Online (Sandbox Code Playgroud)

c++ raii shared-ptr object-lifetime

16
推荐指数
2
解决办法
1972
查看次数

关于模板专业化和结果代码复制的问题

要专门化类模板,必须重新定义底层基本模板中的所有成员函数(即非专用类模板),即使它们预计基本保持不变.有哪些可接受的方法和"最佳实践"可以避免此代码重复?

谢谢.

c++ templates

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

有条件地包含/排除类模板内的数据成员

我想使用 SIMD 指令和编译器内在函数来优化我的 Vector 和 Matrix 类(准确地说是类模板)。我只想针对元素类型为“float”的情况进行优化。使用 SIMD 指令需要接触数据成员。由于我不想被维护两个单独的类的麻烦所困扰,因此我希望能够根据模板参数的类型启用/禁用某些数据成员。这种方法的另一个优点(如果适用的话)是,我可以将一般情况下的相同代码用于我不想为其编写专门化的函数。因此,我想用伪代码实现的是:

template< typename T >
class Vector3 {
    if type( T ) == float:
        union {
            __m128 m128;
            struct {
                float x, y, z, pad;
            };
        };
   else
       T x, y, z;
   endif
};
Run Code Online (Sandbox Code Playgroud)

我知道通过使用 Boost.enable_if 或类似的工具可以有条件地包含成员函数。不过,我正在寻找的是有条件地包含数据成员。一如既往,非常感谢您的帮助。也欢迎其他有效的建议。

谢谢。

c++ templates

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