c++ - 可能的代码速度优化?

标签 c++ variables optimization error-handling static

好的,我有一个 Trig 类,用于存储静态值表,以便在程序中更快地执行 sin、cos 和 tan 函数。与我当前的方法相比,是否有任何可以进行的评论和/或速度改进?感谢之前的回答,我已经感觉自己更能胜任 C++ 了。

三角函数

#pragma once
#include <math.h>

class Trig
{
private:
    struct Table
    {
        static const int multiple = 10; // Accurately stores values to 1/10 of a degree
        double sin[360*multiple];
        Table();
    };
    static const Table table;
    static void shrinkRange(double*); // Shrinks degrees to range 0-359 for proper array indexing
public:
    static double sin(double);
    static double cos(double);
    static double tan(double);
};

三角函数.cpp

#include "Trig.h"

Trig::Table::Table() // table constructor
{
    double const PI = 3.14159265358979323;
    double const degToRad = PI/180.0;
    double const incr = 1.0/multiple;
    int index = 0;
    for (double angle = 0; index != 360*table.multiple; angle += incr)
        Table::sin[index++] = _INC_MATH::sin(angle*degToRad);
}

Trig::Table const Trig::table; // initialize static table member

void Trig::shrinkRange(double* degrees)
{
    if (*degrees >= 360)
        *degrees -= 360*( (int)*degrees/360);
    if (*degrees < 0)
        *degrees += 360*( -(int)*degrees/360 + 1);
}

double Trig::sin(double degrees)
{
    shrinkRange(&degrees);
    degrees *= table.multiple;
    return Trig::table.sin[(int)(degrees+0.5)];
}

double Trig::cos(double degrees)
{
    return Trig::sin(degrees + 90);
}

double Trig::tan(double degrees)
{
    return Trig::sin(degrees)/Trig::cos(degrees);
}

最佳答案

C++ 不是 Java。在这种情况下,您不能调用函数或 访问类的成员,因为没有类对象; 您只需指定其范围即可访问静态成员:

Trig::createTable();
Trig::COS_TABLE[120];

此外(但这在 Java 中也是如此),您可以自动 使用动态确保正确的初始化 初始化。如果你真的想保留当前的 结构,您可以添加类似以下内容:

bool initted = (Trig::createTable(), true);

命名空间范围内的任何位置。更惯用的做法是定义 包含两个表的对象类型,带有构造函数 它初始化了它们,并声明了它的静态实例:

class Trig
{
public:
    struct Tables
    {
        double sin[360];
        double cos[360];
        Tables();
    };
    static Tables const tables;
    //  ...
};

Trig::Tables const Trig::tables;

Trig::Tables::Tables()
{
    double rad = PI / 180.0;
    for ( int angle = 0; angle != 360; ++ angle ) {
        sin[angle] = std::sin( angle * rad );
        cos[angle] = std::cos( angle * rad );
    }
}

无需显式调用Trig::createTable;编译器 会为您解决这个问题。

(Java 中也有类似的技术。出于某种原因, 它们不经常使用,上面的内容非常惯用 C++。)

关于c++ - 可能的代码速度优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18099831/

相关文章:

c++ - Matlab 到 OpenCV 转换的示例

c++ - 如何将类型名称传递给函数?

c++ - C++中变量的声明

javascript - 在 jQuery 中如何删除变量和函数

android - SQL 查询与搜索算法

c++ - OpenJDK 源代码上的 JVM_ENTRY

C++ 可变参数模板 : elegant way of listing all array elements depending on variadic template size

Java:高分法

javascript - 如何将 HTML id 存储为 js 变量?

c++ - 构造函数会影响性能吗?