在阅读了与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位. …
在我的iPhone应用程序中,我正在缓存一些压缩文件的原始数据以节省加载时间.但是这些文件可能会在更新中发生变化.
当应用程序更新或我需要自己清除时,iOS清除/库/缓存吗?
我有用C++编写的多平台游戏.在mac版本中,即使我没有任何obj-c代码,我使用的其中一个库似乎是自动释放的东西,我得到内存泄漏,因为我没有创建NSAutoreleasePool.
我想要的是能够在不使用obj-c代码的情况下创建(并销毁)NSAutoreleasePool,因此我不需要创建.m文件,只需更改我的构建脚本.那可能吗?怎么办?
OBS:Tagged C和C++,因为任何一种语言的解决方案都可以.
我刚刚升级到Xcode 4,当我找到一个名为Fix-it的新功能的信息时,我正在阅读Xcode 4 Transition Guide,它显示了我输入的错误.我正在使用C++(.mm文件)并将编译器设置为LLVM GCC-4.2,但它没有显示我输入的错误.如何启用此功能?
考虑下面的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,仍然有效吗?
我正在使用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) 我在我的应用程序中运行了来自Instruments的OpenGL ES分析工具,它表示在编译着色器之后,我应该在预热传递中调用glDrawArrays.所以我检查了我写的一些着色器的时间,实际上程序第一次运行它的速度要慢得多.
在我的代码中,我有一个通用着色器加载器,它不知道着色器制服/属性,它只是编译它.似乎预热着色器的最佳位置就在那里(所以我不需要在任何地方添加glDrawArrays).我尝试在我的着色器加载器中添加它:
glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);
Run Code Online (Sandbox Code Playgroud)
它修复了延迟,但由于我没有设置任何制服/属性,我不确定它是否安全.它也看起来像一个解决方法.预热该计划的最佳方式是什么?
我正在开发一个多平台项目,有些平台已经禁用了功能,在这些功能的界面中,我常常做的是这样的事情:
bool Foo::bar() const {
// disabled
abort();
}
Run Code Online (Sandbox Code Playgroud)
GCC/LLVM不要求非void函数返回值(它们只是发出警告),在这种情况下,我调用的地方abort(),它们足够智能甚至不发出警告(因为函数永远不会返回).
有没有办法(编译标志?)使Visual C++ 2010的行为方式相同,所以我不打算破坏Windows版本?我知道我总是可以在中止之后返回值,但是当我在其他平台上工作时,我通常会忘记这一点,并且不给出错误的行为似乎更合适.
我有一个 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) 有没有办法声明一个指向不完整类型的指针,该指针将由实现中的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的实现文件中.
在我的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设备是否真的支持它?
我有两个使用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)
重现问题:
我试图在文件中的位置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++ ×8
c ×2
iphone ×2
objective-c ×2
c99 ×1
cmake ×1
filesystems ×1
fseek ×1
ios ×1
ipad ×1
macos ×1
opencv ×1
opengl-es ×1
performance ×1
visual-c++ ×1
xcode ×1