请参阅本指南:http:
//google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone = Integer_Types #Integer_Types
谷歌建议int大部分时间使用.
我尝试遵循本指南,唯一的问题是STL容器.
例如:
1.
void SetElement(int Index, int Value)
{
if (Index > Vector.size()) return;
...
}
Run Code Online (Sandbox Code Playgroud)
如果我用int了Index,我得到了一个警告这里.
2.
for (int i = 0; i < Vector.size(); ++i)
{
...
}
Run Code Online (Sandbox Code Playgroud)
说到循环计数器,同样的警告.
如果我声明Index或i当unsigned int它传播,我必须声明更多变量,unsigned int并且不会有一致性.
我能想到的最好的方法是使用像:
if (Index > static_cast<int>(Vector.size()) ...或者
for (int i = 0; i < static_cast<int>(Vector.size()); ++i) ...
我真的不喜欢演员.
有建议的方法吗?
PS
还有更多的理由比链接给出的for循环示例.
要仅使用有符号整数,我可以避免有符号/无符号警告,强制转换,
并确保每个值都可以是负数(为了保持一致),
并且我总是可以使用-1作为无效值. …
请参阅此Unity文档并转到部分
大堆与缓慢但不常见的垃圾收集
var tmp = new System.Object[1024];
// make allocations in smaller blocks to avoid them to be treated in a special way, which is designed for large blocks
for (int i = 0; i < 1024; i++)
tmp[i] = new byte[1024];
// release reference
tmp = null;
Run Code Online (Sandbox Code Playgroud)
诀窍是在程序启动时预先分配一些内存块.
为什么这个技巧有效?
当应用程序被预先分配时,这些块是否已经被"注册"(或"绑定")到应用程序,因此即使tmp在Start()完成时释放它们,操作系统仍将这些块视为"已注册"到应用?由于块已"注册"到应用程序,因此应用程序的堆大小扩展到一定大小,并且下次获取内存块时,操作系统将从此应用程序的堆中选择它.
我的解释是否正确?无论是或否,有人可以请详细解释,谢谢.
我有一个std::map<int, std::vector<SomeStruct>>,
并提供一个查询std::vector<SomeStruct> FindData(int key).
为了防止复制整个数据,我将其修改为std::vector<SomeStruct>& FindData(int key).
但是,没有确定的数据key,所以有时我没有任何回报.
在这种情况下,我声明一个空的文件范围变量std::vector<SomeStruct>并返回它.
但是如果我选择指向vector的指针,std::vector<SomeStruct>* FindData(int key)那么我就可以返回NULL不存在的指针key.
哪一个更好?
我在问题中学到指针std::vector是坏的(或者很奇怪?不确定)(这个指针操作还有其他语法吗?)
我个人也喜欢参考std::vector,所以我可以使用operator[]更简单,但缺点是我必须为它声明一个额外的空变量.
代码示例如下:In SomeClass.h
typedef std::vector<SomeStruct> DataVec;
typedef std::map<int, DataVec> DataMap;
DataMap m_DataMap;
Run Code Online (Sandbox Code Playgroud)
现在在SomeClass.cpp:
情况1:
namespace
{
DataVec EmptyVector;
}
DataVec& FindDatas(int key)
{
DataMap::iterator It = m_DataMap.find(key);
if (It == m_DataMap.end()) return EmptyVec;
return It->second;
}
Run Code Online (Sandbox Code Playgroud)
案例2:
DataVec* FindDatas(int …Run Code Online (Sandbox Code Playgroud) 我正在阅读这篇msdn文章,逆向示例(键盘和鼠标事件)非常有用,而协方差示例(Mammal和Dog)看起来并不那么好.
键盘和鼠标事件非常棒,因为您可以为多个案例使用1个处理程序; 但我不能想到将一个返回更多派生类型的处理程序分配给返回基类型的处理程序的优点,更不用说拥有一个关心返回类型的委托似乎不太常见了?
有人可以在代表中提供一个更实际的协方差例子吗?
我在我的程序上运行了一个分析器(非常困),它在我的重置功能上显示了很高的百分比(重置功能每帧运行).程序看起来像这样:
初始部分:
std::vector<std::vector<int>> VecOfVecOfPath;
VecOfVecOfPath.resize(20);
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640);
Run Code Online (Sandbox Code Playgroud)
VecOfVecOfPath是其他函数找到的一系列路径.VecOfVecOfPath [i]将在每帧执行期间填充.例如,它push_back由其他功能组成,并在每帧使用前重置.
重置功能:
void Reset()
{
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear();
}
Run Code Online (Sandbox Code Playgroud)
所以重置非常简单,但在profiler中确实有很高的排名.
这是常见的吗?即使对于内置类型向量,vector :: clear()是否确实有这样的开销?
谢谢!
我尝试在发布模式下构建程序,然后将成本降低到几乎为零.从12~13%到0.03~0.04%.
然后我去了源代码,并且有类似ITERATOR_DEBUG_LEVEL的定义,在调试模式下影响额外的操作.
所以就像@noggin182建议的那样,在Debug和Release模式下情况有所不同.
引用:"请确保你在发布版本中进行分析并搜索是否有任何预处理器条件定义你设置为提升性能. - noggin182 1月3日15:32"
请查看图片.
我想这与我有关package.json但不太确定.
回复评论以获取更多信息
最初我正在安装material-ui.
详细信息如下:
我:\ react-boilerplate> npm install material-ui
react-boilerplate@3.4.0 I:\ react-boilerplate
+ - material-ui@0.17.1
| + - keycode@2.1.8
| + - lodash.throttle@4.1.1
| + - UNMET PEER DEPENDENCY react@^15.4.2
| + - react-addons-create-fragment@15.4.2
| + - react-addons-transition-group@15.4.2
| + - react-event-listener@0.4.3
| | + - UNMET PEER DEPENDENCY react@^15.4.2
| | ` - react-addons-shallow-compare@15.4.2
| + - recompose@0.22.0
| | ` - change-emitter@0.1.3
| ` - simple-assign@0.1.0
+ - UNMET PEER DEPENDENCY react-tap-event-plugin@^2.0.1
` …
我有一个包含许多成员和不同类型的结构(大约有 20 个成员):
enum TheEnum
{
FIRST = 0,
SECOND,
...
}
struct TheStruct
{
TheEnum z; // <--- the point !!! note that this is the first member (edited)
int a;
int b;
char c[32];
...
}
Run Code Online (Sandbox Code Playgroud)
由于有一个枚举类型成员,我不能像这样声明:
TheStruct Object = {0};
Run Code Online (Sandbox Code Playgroud)
它会给出编译错误,但在我看来,这种初始化是最好的方法。
我能想到的其他方法是:
1.ZeroMemory它,但我不喜欢这个。
2. 编写一个构造函数,但这需要大量的工作。
3. 只是不要初始化它。
那么,有没有办法解决枚举问题呢?我应该在这三种方式中选择一种吗?
谢谢!
编辑:我的一个大错误,该错误仅在TheEnum作为第一个成员出现时才会发生。
使用 vs2008 编译并作为 C++ 代码。
错误是C2440。http://msdn.microsoft.com/en-us/library/sy5tsf8z%28v=VS.80%29.aspx
我尝试npm install了npm install --no-optional我的分叉存储库,但它没有完全安装:(git+https://github.com/marsonmao/react-sketch#v0.4.104链接)。
使用 npm install 后,只安装了部分存储库: 中只有/node_modules和.eslintrc、karma.config.js、README.md... 等MyProject/node_modules/react-sketch,但没有/lib和/src... 等。
然后我尝试了一下yarn install,成功了,存储库中的每个文件都已安装。
那么为什么 npm 失败而yarn 成功呢?
npm 版本:5.5.1,yarn 版本:1.3.2
dialog是一个OpenFileDialog类对象,我正在使用ShowDialog()方法.
当我使用包含相对路径的路径时,例如:
dialog.InitialDirectory = "..\\abcd";
dialog.InitialDirectory = Directory.GetCurrentDirectory() + "..\\abcd";
Run Code Online (Sandbox Code Playgroud)
ShowDialog() 崩溃,我只能做一个明确的路径,从磁盘驱动器开始:
dialog.InitialDirectory = "C:\\ABC\\DEF\\abcd";
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我希望路径是我的.exe的当前目录的1级,然后向下到目录abcd)
.exe的当前路径可以找到Directory.GetCurrentDirectory(),这是完全正常的,但我不能继续"..")
目录层次结构如下:
ABC
DEF
abcd (where i want)
defg (where .exe is at)
Run Code Online (Sandbox Code Playgroud)
那么,有没有任何使用方法"..\\"有InitialDirectory?
或者我必须使用明确的路径?
谢谢!