我找不到任何关于此的信息,但假设我有
var arr = [1, 2, 3];
var x = arr[1.5];
Run Code Online (Sandbox Code Playgroud)
我假设Javascript floor是索引并返回索引1处的项目,但它似乎至少在Chrome中返回undefined.
它是否正确?我找不到任何证实这一点的标准或文件.这实际上真的很不方便,因为我假设向下舍入行为允许你将范围[0,n)中的任何浮点数传递给数组索引,但是如果你做浮点数学运算,你似乎会默默地破坏你的数组不圆润.
编辑:如果有人正在维护javascript陷阱列表,请添加此一个.现在我要查看10k行的javascript代码,看看我做出的这个假设在哪里悄悄导致错误!
考虑以下功能:
void f(const char* str);
Run Code Online (Sandbox Code Playgroud)
假设我想使用stringstream生成一个字符串并将其传递给此函数.如果我想在一个声明中这样做,我可能会尝试:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:'str()'不是'basic_ostream'的成员.好的,所以operator <<返回ostream而不是ostringstream - 如何将它转换回ostringstream?
1)这个演员安全吗?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
Run Code Online (Sandbox Code Playgroud)
现在有了这个,结果是运算符<<("Value:")调用,它实际上调用了ostream的运算符<<(void*)并打印了一个十六进制地址.这是错的,我想要的是文字.
2)为什么operator << on临时std :: ostringstream()会调用ostream运算符?当然临时有一种'ostringstream'而不是'ostream'?
我可以施放临时强制执行正确的操作员!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
Run Code Online (Sandbox Code Playgroud)
这似乎有效并将"Value:5"传递给f().
3)我现在依赖于未定义的行为吗?演员看起来很不寻常.
我知道最好的选择是这样的:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
Run Code Online (Sandbox Code Playgroud)
...但我对在一行中做这件事的行为很感兴趣.假设有人想制作一个(可疑的)宏:
#define make_temporary_cstr(x) (static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << x).str().c_str())
// ...
f(make_temporary_cstr("Value: " << 5));
Run Code Online (Sandbox Code Playgroud)
这会按预期运作吗?
使用g ++执行此操作的正确方法是什么:
template < typename F >
void g (F f);
template < typename ... A >
void h (A ... a);
template < typename ... A >
void f (A ... a) {
g ([&a] () { h (a...); }); // g++-4.6: error: parameter packs not expanded with »...«
}
Run Code Online (Sandbox Code Playgroud) 我有两个容器,假设它们的定义如下:
std::vector<std::unique_ptr<int>> a;
std::vector<std::unique_ptr<int>> b;
Run Code Online (Sandbox Code Playgroud)
假设双方a和b被填充.我想使用move-semantics 将整个容器插入a 到特定位置b,以便unique_ptrs移动到b.我们假设它i是一个有效的迭代器b.以下不起作用:
b.insert(i, a.begin(), a.end()); // error: tries to copy, not move, unique_ptrs
Run Code Online (Sandbox Code Playgroud)
是否有另一种STL算法可以实现这种"插入范围移动"?我想我需要一种emplace_range,但VS2010的STL中没有一种.我不想写一个逐个插入的循环,因为它会在每次插入时向上移动向量的整个内容时结束令人讨厌的O(n ^ 2).还有其他选择吗?
在我正在编写的程序中出现了以下模式.我希望它不是太做作,但它设法Foo在const方法中改变一个对象Foo::Questionable() const,而不使用任何const_cast或类似的东西.基本上,Foo存储参考FooOwner,反之亦然,并在Questionable(),Foo设法修改本身在一个const方法通过调用mutate_foo()关于它的主人.问题遵循代码.
#include "stdafx.h"
#include <iostream>
using namespace std;
class FooOwner;
class Foo {
FooOwner& owner;
int data;
public:
Foo(FooOwner& owner_, int data_)
: owner(owner_),
data(data_)
{
}
void SetData(int data_)
{
data = data_;
}
int Questionable() const; // defined after FooOwner
};
class FooOwner {
Foo* pFoo;
public:
FooOwner()
: pFoo(NULL)
{}
void own(Foo& foo)
{
pFoo = &foo;
}
void mutate_foo()
{
if …Run Code Online (Sandbox Code Playgroud) 我有一个DLL,需要访问存储在主机应用程序中的STL容器中的数据.因为C++没有标准的ABI,并且我想支持不同的编译器,所以应用程序和DLL之间的接口基本上必须保持普通的旧数据.
对于向量,这是相对简单的.你可以简单地返回向量的内存块,因为它保证是有条件的:
// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
if (!vec.empty())
ptr = &(vec.front());
count = vec.size();
}
Run Code Online (Sandbox Code Playgroud)
现在,DLL可以通过该接口对向量的数据进行安全的只读访问.DLL也可以包装它以将内容复制到自身的向量中.
那么STL列表(和deques)呢?是否有另一种直接允许通过DLL边界访问的方法?或者我是否必须使用某种GetFirst()/ GetNext()接口?我可能需要为很多列表执行此操作,因此有一个像vector一样简单的解决方案会很好.
我注意到在MFC应用程序中我正在开发的同时拖动滚动条以平滑地向下滚动文档,当屏幕上包含大约一段文本的块时,帧速率会下降到不连续的水平,但是当它在屏幕外时会变得柔滑.在调查表现时,我发现CDC::DrawText对该段文本负责的单一调用.这是一个优化的发布版本.
我QueryPerformanceCounter以前只得到DrawText调用的高分辨率测量,如下所示:
QueryPerformanceCounter(...);
pDC->DrawText(some_cstring, some_crect, DT_WORDBREAK);
QueryPerformanceCounter(...);
Run Code Online (Sandbox Code Playgroud)
文本是unicode,lorem-ipsum样式填充,长度为865个字符,并且在给定矩形和字体(Segoe UI,lfHeight= -12,标准正文文本大小)的情况下包裹7位和1位线.根据我的测量结果,单独调用平均需要7.5 ms,奇数峰值需要21 ms.(注意为了跟上60Hz的监视器,你需要大约16ms来渲染每次更新.)
我尝试进行一些更改以提高性能:
DT_WORDBREAK性能提高到大约1毫秒(大约快7倍),但只有一行文字进入屏幕,并且只有超过7行断字,这似乎告诉我瓶颈在其他地方.SetBkMode(TRANSPARENT))绘制文本.所以我尝试了带有实心背景填充的不透明模式.没有得到改善.lfQuality的CLEARTYPE_QUALITY到NONANTIALIASED_QUALITY.它看起来像带有锋利边缘的垃圾,而且没有任何改进.这是在配备英特尔酷睿2双核P8400 @ 2.26 GHz和4 GB RAM的Windows 7 64位笔记本电脑上运行 - 我不认为它是一个慢速系统.
我每次绘制时都会调用DrawText(),这显然会使用如此慢的函数来破坏性能,特别是如果这些文本块中的几个一次可见的话.这足以让体验变得迟钝.但是,Firefox可以使用更多文本在ClearType中呈现这样的页面,并且似乎可以很好地应对.我究竟做错了什么?如何解决实际DrawText调用的糟糕表现?
我糊涂了.要在Windows上的OpenGL 1.x中使用Framebuffer对象扩展(FBO),我使用哪些?:
wglGetProcAddress("glGenFramebuffers");
// or
wglGetProcAddress("glGenFramebuffersEXT");
Run Code Online (Sandbox Code Playgroud)
据我所知,来自不同硬件的用户的报告,一些驱动程序支持所有组合,两者之一或两者兼而有之.
哪个是正确的?有些司机真的支持一个但不支持另一个吗?如果找不到,试图从一个回到另一个是否正确?
编辑: 我仍然遇到ATI Radeon卡和围绕此问题的代码的严重问题.我们刚刚使用此代码(www.scirra.com)推出了商业编辑器.似乎无论我使用哪种代码组合来使用FBO,一些不同的用户组合报告他们根本看不到任何东西(即没有任何渲染).
这是我检测是否使用ARB功能(无后缀)或EXT后缀功能的代码.这在启动时运行:
gl_extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
gl_shading_language = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));
// If OpenGL version >= 3, framebuffer objects are core - enable regardless of extension
// (the flags are initialised to false)
if (atof(gl_version) >= 3.0)
{
support_framebuffer_object = true;
support_framebuffer_via_ext = false;
}
else
{
// Detect framebuffer object support via ARB (for OpenGL version < 3) …Run Code Online (Sandbox Code Playgroud) 我发布了一个Windows桌面应用程序,其中包含由Verisign Class 3代码签名证书进行数字签名的所有可执行文件.对于绝大多数用户来说,这似乎工作正常.
但是少数用户报告证书无效.他们说它提出了"证书链已处理,但终止于信任提供商不信任的根证书"的消息.这对应于错误代码CERT_E_UNTRUSTEDROOT (0x800B0109).这也是在完全更新的Windows 7机器上报告的.所以我的证书可能是正常的,但Windows有时不相信VeriSign证书.
为什么Windows有时不信任VeriSign?有什么我可以添加到我的安装程序(也签名),这将告诉Windows信任证书?
windows code-signing digital-certificate digital-signature verisign
ES6 有一个新的 Set 数据结构,用于存储唯一对象的集合。然而,它基于对象引用而不是值比较。据我所知,这使得在没有字符串化的情况下不可能有一组数字。
例如,在 Chrome 的控制台中输入(需要 Chrome 38+):
> var s = new Set();
< undefined
> s.add([2, 3]);
< Set {[2, 3]}
> s.has([2, 3])
< false <--- was hoping for 'true'
Run Code Online (Sandbox Code Playgroud)
这似乎是设计使然:因为我传递了一个不同的[2, 3]to数组has(),它返回 false,因为虽然内容相同但它只查看对象引用,并且我分配了一个新的不同数组来传递 to has()。我需要存储对我传递给与add()检查的原始数组的引用has(),但这并不总是可能的。例如,如果数字对代表坐标,我可能需要检查集合是否有[obj.x, obj.y],但这将始终返回 false,因为它分配了一个新数组。
解决方法是将数组和键字符串化为“2, 3”之类的字符串。然而,在像游戏引擎这样对性能敏感的东西中,如果每个集合访问都需要进行字符串分配并转换和连接数字字符串,那就很不幸了。
ES6 是否提供了任何功能来解决这个问题而无需进行字符串化,或者 ES7 是否有任何即将推出的功能也可以提供帮助?