是否有任何可移植的方法来确定任何类型的最大可能对齐方式是什么?
例如,在x86上,SSE指令需要16字节对齐,但据我所知,没有指令需要更多,因此任何类型都可以安全地存储到16字节对齐的缓冲区中.
我需要创建一个缓冲区(例如char数组),我可以在其中编写任意类型的对象,因此我需要能够依赖缓冲区的开头进行对齐.
如果一切都失败了,我知道,分配使用char数组new
保证具有最大对齐,而是与TR1/C++ 0x中的模板alignment_of
和aligned_storage
,我想知道是否有可能在我的缓冲创建就地缓冲区类,而不是要求动态分配的数组的额外指针间接.
想法?
我意识到有很多选项可以确定有界类型的最大对齐:一个联合,或者只是alignment_of
来自TR1,但我的问题是类型集是无界的.我事先并不知道哪些对象必须存储到缓冲区中.
我刚刚从微软网站安装了VS2010 Beta 1,我启动了一个基本的C++ Win32控制台应用程序,它生成了以下代码:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试编译代码只是为了看它是如何运行的,然后我遇到了几个(超过100个)编译错误.
这是构建输出的第一部分:
1>ClCompile:
1> stdafx.cpp
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdefs.h(520): error C2065: '_In_opt_z_' : undeclared identifier
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdefs.h(520): error C2143: syntax error : missing ')' before 'const'
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdefs.h(520): warning C4229: anachronism used : modifiers on data are ignored
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdefs.h(520): error C2182: '_invalid_parameter' : illegal use of type 'void'
1>c:\program files\microsoft visual studio 10.0\vc\include\crtdefs.h(520): error …
Run Code Online (Sandbox Code Playgroud) 我有一系列字符串存储在一个数组中,由空格分隔(例如['f','o','o','\ 0','b','a','r','\ 0'...]),我需要把它分成一个std::vector<std::string>
或类似的.
我可以写一个10行循环来使用std::find
或strlen
(事实上我刚才这样做),但我想知道是否有更简单/更优雅的方法来做,例如我忽略的一些STL算法,可以哄骗这样做.
这是一个相当简单的任务,如果有一些聪明的STL技巧可以应用于使其更简单,我也不会感到惊讶.
任何接受者?
我试图跟上C++,因为他们引入了1998 ANSI/ISO C++.我吸收了新的概念并试图理解它们.我了解了异常处理,模板和命名空间.我已经阅读了有关新的强制转换机制并使用了STL库.
所有这些概念都需要很多能量.但是现在看一下新的C++ 0x标准时,我有点担心C++的未来.
事情变得越来越复杂.这种语言正在变成一个怪物.
我不确定我是否想要继续使用该语言,因为我无论如何都不会在C++中进行日常的黑客攻击.我主要使用解释或字节码语言.
那么,为什么我还要费心去学习这种难度大但功能强大的语言呢?我可以用Python等人做95%的业务.剩余的5%,我可以毫不费力地处理普通的旧C++或C.
你怎么看?
我遇到了cppunit,但它看起来并不容易使用(也许我看起来并不难,也许是因为C++不能像Java/C#那样工作).有广泛使用的简单替代品吗?
实际上,是 cppunit是C++的标准单元测试框架吗?
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("test.txt");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
fstream是从iostream派生的,为什么我们要在上面的代码中包含两者?
我删除了fstream,然而,ofstream存在错误.我的问题是ofstream是从ostream派生出来的,为什么需要fstream才能编译?
一连串的问题BOOST_FOREACH
促使我向Boost库的用户询问他们正在做什么(如果有的话)准备他们的代码以便移植到提议的新C++标准(又名C++ 0x).例如,如果您使用shared_ptr
以下内容,您是否编写了这样的代码:
#ifdef CPPOX
#include <memory>
#else
#include "boost/shared_ptr.hpp"
#endif
Run Code Online (Sandbox Code Playgroud)
还有命名空间问题 - 将来,shared_ptr
它将成为std
命名空间的一部分- 你如何处理它?
我对这些问题感兴趣,因为我决定咬紧牙关并认真开始学习提升,我想在我的代码中使用最佳实践.
不完全是大量答案 - 这是否意味着它不是问题?无论如何,感谢那些回复的人; 我接受了jalfs的回答,因为我喜欢被建议什么都不做!
我知道当Windows关闭时,它会向每个应用程序发送WM_QUERYENDSESSION消息.这样可以轻松检测Windows何时关闭.但是,是否可以知道计算机是否要关闭电源,或者是否在Windows关闭后重新启动.
我并不是特别有希望,考虑到MSDN上的文档有这样的说法WM_QUERYENDSESSION
:"......无法确定发生了哪个事件,"但stackoverflow的累积聪明从未让我感到惊讶.
我正在将一个非常庞大且非常古老的(25年!)程序从C转换为C++.
在其中有许多(非常非常多)的地方,我使用各种整数索引访问全局一维UBYTE数组.有时这个指数可能是负面的.
我有时候,但并非总是如此,陷入困境,并确保没有出错,但作为一个腰带和大括号的测量,我实际上遇到了麻烦,确保在阵列前面有另一块内存并用右边填充它这样的值,如果我不小心省略了陷阱负数条件,那么仍然会在数组访问中获取正确的答案.这实际上很多年都很好.
但是现在在C++下,似乎访问具有负数的数组的行为有所不同,现在我的程序运行得很糟糕.我修复了一个未处理的负数的情况,程序似乎工作正常,但我很紧张,我没有陷入所有的负数,可能会有问题.
所以现在我的问题是,在运行时,有没有办法检测任何访问具有负索引的数组的实例?如果有人能想出答案,我会留下深刻的印象.如果你非常肯定它不能以任何自动方式完成,那么告诉我这也是有价值的信息.
我应该补充一点,我不是一个真正的C++程序员(还).到目前为止,我所做的只是绝对最低限度(几乎没有)让程序在C++编译器下编译.因此,如果您的答案涉及花哨的"专家,C++解决方案",那么请尝试用一个音节的单词解释或给我一个链接,以便我可以查找它.
在boost中是否有可用的模板RAII
.有像这样的类scoped_ptr
,shared_ptr
它基本上用于指针.这些类可以用于除指针之外的任何其他资源.是否有任何模板可以使用一般资源.
例如,在范围的开头获取的某些资源必须以某种方式在范围的末尾发布.获取和发布都需要一些步骤.我们可以编写一个模板,它需要两个(或者一个对象)仿函数来完成这个任务.我还没有想过如何实现这一点,我只是想知道有没有现成的方法来做到这一点
Edit:
如何在C++ 0x中支持lambda函数