小编fba*_*ipe的帖子

为什么启用优化时sin/cos会变慢?

在阅读了与sin/cos的性能相关的问题(为什么std :: sin()和std :: cos()比sin()和cos()慢?),我用他的代码做了一些测试,发现了奇怪的是:如果我用浮点值调用sin/cos,那么在使用优化编译时,它比使用double要慢得多.

#include <cmath>
#include <cstdio>

const int N = 4000;

float cosine[N][N];
float sine[N][N];

int main() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            float ang = i*j*2*M_PI/N;
            cosine[i][j] = cos(ang);
            sine[i][j] = sin(ang);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过上面的代码我得到:

使用-O0:2.402s

使用-O1:9.004s

使用-O2:9.013s

使用-O3:9.001s

现在,如果我改变

float ang = i*j*2*M_PI/N;
Run Code Online (Sandbox Code Playgroud)

double ang = i*j*2*M_PI/N;
Run Code Online (Sandbox Code Playgroud)

我明白了:

使用-O0:2.362s

使用-O1:1.188s

-O2:1.197s

使用-O3:1.197s

如果没有优化,第一次测试怎么能更快?

我正在使用g ++(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2,64位. …

c++ performance

24
推荐指数
1
解决办法
2420
查看次数

应用程序更新中是否清楚<Application_Home>/Library/Caches?

在我的iPhone应用程序中,我正在缓存一些压缩文件的原始数据以节省加载时间.但是这些文件可能会在更新中发生变化.

当应用程序更新或我需要自己清除时,iOS清除/库/缓存吗?

filesystems iphone

23
推荐指数
2
解决办法
3万
查看次数

如何在没有Objective-C的情况下创建NSAutoreleasePool?

我有用C++编写的多平台游戏.在mac版本中,即使我没有任何obj-c代码,我使用的其中一个库似乎是自动释放的东西,我得到内存泄漏,因为我没有创建NSAutoreleasePool.

我想要的是能够在不使用obj-c代码的情况下创建(并销毁)NSAutoreleasePool,因此我不需要创建.m文件,只需更改我的构建脚本.那可能吗?怎么办?

OBS:Tagged C和C++,因为任何一种语言的解决方案都可以.

c c++ macos objective-c

7
推荐指数
1
解决办法
807
查看次数

如何在Xcode 4.0上启用fix-it?

我刚刚升级到Xcode 4,当我找到一个名为Fix-it的新功能的信息时,我正在阅读Xcode 4 Transition Guide,它显示了我输入的错误.我正在使用C++(.mm文件)并将编译器设置为LLVM GCC-4.2,但它没有显示我输入的错误.如何启用此功能?

xcode

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

用C/C++求和bool值

考虑下面的C++代码:

bool a = 5;
bool b = 6;
int c = (int)a + (int)b;
Run Code Online (Sandbox Code Playgroud)

当我编译并运行此代码时,c的值为2.标准是否保证在任何编译器/平台中,使用false(0)或true(不一定为1)初始化的bool值在操作中将为1,并且上面的代码将始终为导致c为2?

在C99中,包括stdbool.h,仍然有效吗?

c++ c99

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

相机运动补偿

我正在使用openCV来为应用程序实现相机运动补偿.我知道我需要计算光流,然后找到两帧之间的基本矩阵来转换图像.

这是我到目前为止所做的:

void VideoStabilization::stabilize(Image *image) {
    if (image->getWidth() != width || image->getHeight() != height) reset(image->getWidth(), image->getHeight());

    IplImage *currImage = toCVImage(image);
    IplImage *currImageGray = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);

    cvCvtColor(currImage, currImageGray, CV_BGRA2GRAY);

    if (baseImage) {
        CvPoint2D32f currFeatures[MAX_CORNERS];
        char featuresFound[MAX_CORNERS];

        opticalFlow(currImageGray, currFeatures, featuresFound);

        IplImage *result = transformImage(currImage, currFeatures, featuresFound);
        if (result) {
            updateImage(image, result);
            cvReleaseImage(&result);
        }
    }

    cvReleaseImage(&currImage);

    if (baseImage) cvReleaseImage(&baseImage);
    baseImage = currImageGray;

    updateGoodFeatures();
}

void VideoStabilization::updateGoodFeatures() {
    const double QUALITY_LEVEL = 0.05;
    const double MIN_DISTANCE = 5.0;

    baseFeaturesCount = MAX_CORNERS;

    cvGoodFeaturesToTrack(baseImage, …
Run Code Online (Sandbox Code Playgroud)

c++ opencv

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

如何解决首次使用着色器时的延迟?

我在我的应用程序中运行了来自Instruments的OpenGL ES分析工具,它表示在编译着色器之后,我应该在预热传递中调用glDrawArrays.所以我检查了我写的一些着色器的时间,实际上程序第一次运行它的速度要慢得多.

在我的代码中,我有一个通用着色器加载器,它不知道着色器制服/属性,它只是编译它.似乎预热着色器的最佳位置就在那里(所以我不需要在任何地方添加glDrawArrays).我尝试在我的着色器加载器中添加它:

glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);
Run Code Online (Sandbox Code Playgroud)

它修复了延迟,但由于我没有设置任何制服/属性,我不确定它是否安全.它也看起来像一个解决方法.预热该计划的最佳方式是什么?

iphone opengl-es-2.0

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

Visual C++错误:函数必须返回一个值

我正在开发一个多平台项目,有些平台已经禁用了功能,在这些功能的界面中,我常常做的是这样的事情:

bool Foo::bar() const {
    // disabled
    abort();
}
Run Code Online (Sandbox Code Playgroud)

GCC/LLVM不要求非void函数返回值(它们只是发出警告),在这种情况下,我调用的地方abort(),它们足够智能甚至不发出警告(因为函数永远不会返回).

有没有办法(编译标志?)使Visual C++ 2010的行为方式相同,所以我不打算破坏Windows版本?我知道我总是可以在中止之后返回值,但是当我在其他平台上工作时,我通常会忘记这一点,并且不给出错误的行为似乎更合适.

c++ visual-c++ unreachable-code

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

Objective-C++ C++ 对象析构函数

我有一个 Objective-C 类,其中一个变量是 C++ 对象(我的大部分代码是 C++,但我需要一些 ObjC 类来与 iOS 库集成)。Objective-C++ 是否保证在销毁Objective-C 对象时C++ 对象会被正确销毁?

一些示例代码:

class MyCppClass {
    // ...
};

@interface MyObjCClass : NSObject {
    MyCppClass myCppObject; // is it ok to do it?
}

// ...

@end
Run Code Online (Sandbox Code Playgroud)

c++ objective-c objective-c++

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

指向不完整类型的typedef的指针

有没有办法声明一个指向不完整类型的指针,该指针将由实现中的typedef设置?

这是我想要的例子:

#ifndef TEST_H
#define TEST_H

namespace std {
    class string; // THIS WON'T WORK!
}

struct Test {
    std::string *value;
};

#endif
Run Code Online (Sandbox Code Playgroud)

string是basic_string的typedef,因此示例中的代码不起作用.我可以声明一个不完整类型的std :: basic_string,但那看起来像一个变通方法.

我知道编译器不会为typedef生成符号,并且可能会在typedef中使用相同的名称来表示不同文件中的不同类型.但由于指针是指针(至少对编译器而言),因此应该可以做类似的事情.

编辑:这只是一个极简主义的工作例子.在我真正的问题中,我有一个Facade,它使用一个只有Facade应该知道的库中的类(不,它不是std :: string,而且库不是stl).我并不是真的担心循环包含,但由于我的项目中的很多文件包括这个Facade(直接或间接),我担心编译时间,所以我想只将库文件包含在Facade的实现文件中.

c++

4
推荐指数
1
解决办法
417
查看次数

iPad缺少OpenGL扩展字符串GL_APPLE_texture_2D_limited_npot

在我的iOS游戏中,我想使用GL_APPLE_texture_2D_limited_npot扩展名来节省内存(游戏中有NPOT纹理,在我目前的实现中我添加了一些填充以使这些功能为2).

我在我的iPad(第一代)测试.到目前为止我读过的所有东西都说支持OpenGLES2(包括iPad)的所有iOS设备也支持GL_APPLE_texture_2D_limited_npot(非常好,因为我的游戏使用OpenGLES2).我已经在我的iPad上进行了测试,它确实支持(如果我将包装设置为GL_CLAMP_TO_EDGE,我删除了填充和图像工作),但是当我调用glGetString(GL_EXTENSIONS)时,扩展名没有显示.代码:

const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
std::cout << extensions << "\n";
Run Code Online (Sandbox Code Playgroud)

结果是:

GL_OES_depth_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_texture_float GL_OES_texture_half_float GL_OES_vertex_array_object GL_EXT_blend_minmax GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_EXT_separate_shader_objects GL_EXT_shader_texture_lod GL_EXT_texture_filter_anisotropic GL_APPLE_framebuffer_multisample GL_APPLE_rgb_422 GL_APPLE_texture_format_BGRA8888 GL_APPLE_texture_max_level GL_IMG_read_format GL_IMG_texture_compression_pvrtc
Run Code Online (Sandbox Code Playgroud)

为什么这个扩展名没有用glGetString(GL_EXTENSIONS)显示?检查它的正确方法是什么?所有OpenGLES2 iOS设备是否真的支持它?

opengl-es ipad ios

3
推荐指数
1
解决办法
1159
查看次数

CMake:具有多个项目的静态库

我有两个使用CMake的项目.项目A构建一个静态库,然后链接到项目B.问题是,当我从项目A更改源文件并构建两个项目时,项目B将不会再自动链接.如何将项目A(静态库)的输出添加到项目B?

编辑:这是我的问题的一个例子:

ProjectA CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
PROJECT(PROJECTA)

ADD_LIBRARY(projectA STATIC "src/foo.cpp")
Run Code Online (Sandbox Code Playgroud)

ProjectB CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
PROJECT(PROJECTB)

set(PROJECTA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ProjectA)
include_directories(${PROJECTA_DIR}/include)

link_directories(${PROJECTA_DIR}/build)

ADD_EXECUTABLE(projectB "src/main.cpp")
target_link_libraries(projectB projectA)
Run Code Online (Sandbox Code Playgroud)

重现问题:

  1. 构建两个项目(需要首先构建ProjectA).
  2. 更改ProjectA/src/foo.cpp
  3. 构建ProjectA(它将更新libProject.a)
  4. 构建ProjectB(它不会将可执行文件与新的libProject.a链接,而是假设没有进行任何更改并且什么都不做).

cmake

3
推荐指数
1
解决办法
1952
查看次数

fseek在写入值时返回到文件末尾

我试图在文件中的位置4覆盖4个字节,但fseek似乎没有工作.

我的代码:

int r = fseek(cacheStream, 4, SEEK_SET);
std::cout << "fseek returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;
r = fwrite(&chunckSize, sizeof(uint32_t), 1, cacheStream);
std::cout << "fwrite returns " << r << std::endl;
std::cout << "ftell " << ftell(cacheStream) << std::endl;
Run Code Online (Sandbox Code Playgroud)

cacheStream以"ab"打开.输出是:

fseek returns 0
ftell 4
fwrite returns 1
ftell 2822716
Run Code Online (Sandbox Code Playgroud)

该值未被覆盖,而是写在文件末尾.什么可能导致与fseek的奇怪行为?

c c++ fseek

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