当我尝试在Mac上编译我的包装器时,库较旧并且界面略有不同.99%的代码是相同的,只需要改变一些C调用.
在Go中处理这样的问题的最佳做法是什么?
有没有办法进行条件编译或条件导入?
type Vertex struct {
X, Y float64
}
func main() {
v := Vertex{3, 4}
fmt.Println(v)
d := &Vertex{3, 4}
fmt.Println(d)
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/XluyUHL2y7
这两种初始化Vertex结构的方法有什么区别?
我知道第二个是指针分配,但我在实践中看不出这个解决方案的任何区别.
我有一个包含500,000个文件的目录.我想尽快访问它们.该算法要求我重复打开和关闭它们(不能同时打开500,000个文件).
我怎样才能有效地做到这一点?我原本以为我可以缓存inode并以这种方式打开文件,但是*nix没有提供通过inode打开文件的方法(安全性或其他一些方法).
另一个选择是不要担心它,并希望FS在文件查找目录中做得很好.如果这是最好的选择,哪个FS最好.某些文件名模式是否比其他文件模式更快?例如01234.txt vs foo.txt
顺便说一句,这完全在Linux上.
对于iPhone游戏开发,我为了性能而从PNG格式切换到PVRTC格式.但是PVRTC压缩正在创建比PNG文件大得多的文件.因此,一个140 KB(1024x1024)的PNG在PVRTC格式中膨胀到512 KB或更多.我在某处读到一个50KB的PNG文件被压缩到大约10KB,所有,在我的情况下,它的另一种方式..
任何理由为什么会这样发生以及如何避免这种情况..如果PVRTC压缩盲目地进行4bpp转换(1024x1024x0.5)而不考虑PNG中的透明度,那么我们在这里实现的压缩是什么.
我的游戏中有100个这样的1024x1024图像,因为有很多角色各自做一些复杂的动画..所以在这个512KB的图像速率下,我的应用程序将超过50MB ..这对我的客户来说是不可接受的..(与PNG,我本可以将我的应用程序设置为10MB)
工作草案明确地指出,默认函数必须是特殊的成员函数(例如复制构造函数,默认构造函数等,(§8.4.2.1-1)).这很有道理.
但是,我没有看到对删除函数的任何此类限制(第8.4.3节).是对的吗?
或者换句话说这三个例子是否有效c++0?
struct Foo
{
// 1
int bar( int ) = delete;
};
// 2
int baz( int ) = delete;
template< typename T >
int boo( T t );
// 3
template<>
int boo<int>(int t) = delete;
Run Code Online (Sandbox Code Playgroud) 我刚刚看了一个由GMAN评论说
class A
{
public:
A() :
m_ptr() // m_ptr is implicitly initialized to NULL
{ }
};
Run Code Online (Sandbox Code Playgroud)
应该优先考虑
class A
{
public:
A() :
m_ptr(NULL) // m_ptr is explicitly initialized to NULL
{ }
};
Run Code Online (Sandbox Code Playgroud)
请注意NULL第一个示例中缺少的内容.
GMan对吗?这可能有点主观,所以"你更喜欢空的初始化器进行默认初始化吗?" 可能更合适.
此外,如果您更喜欢空的初始化器,这是否适用于其他整体成员?
class B
{
public:
B() :
m_count(),
m_elapsed_secs()
{}
private:
std::size_t m_count;
float m_elapsed_secs; //the elapsed time since instantiation
};
Run Code Online (Sandbox Code Playgroud)
当然,请捍卫您的观点,并说明为什么一个人应该优先于另一个.
Mercurial提供命令父级来检查给定修订版的父级.这可以很容易地用于向后遍历DAG.我需要向前穿越DAG.有hg children命令吗?
我厌倦了等待编译器的支持nullptr(gcc 4.6确实如此,但它是如此新的少数发行版支持它).
因此,作为一个止损间隙直到nullptr完全支持我决定模仿它.有两个仿真示例:一个来自这里,一个来自wikibooks.
值得注意的是,两个实现都没有提及operator ==.但是,没有一个,以下代码将无法编译.
int* ptr = nullptr;
assert( ptr == nullptr ); // error here: missing operator ==
Run Code Online (Sandbox Code Playgroud)
这个operator ==错误是编译器错误吗?
是operator ==(和!=,<,<=,等)需要更完美的模拟nullptr?
模拟nullptr和真实交易还有什么不同?
我有一个类来包装字符串文字并在编译时计算大小.
构造函数如下所示:
template< std::size_t N >
Literal( const char (&literal)[N] );
// used like this
Literal greet( "Hello World!" );
printf( "%s, length: %d", greet.c_str(), greet.size() );
Run Code Online (Sandbox Code Playgroud)
但是代码有问题.下面的代码编译,我想使它成为一个错误.
char broke[] = { 'a', 'b', 'c' };
Literal l( broke );
Run Code Online (Sandbox Code Playgroud)
有没有办法限制构造函数,使它只接受c字符串文字?编译时间检测是首选,但如果没有更好的方法,则可以接受运行时.
我有一个模板工作代码.与stl :: string类似,我主要使用我的模板,在多个编译单元中有一个参数.为了节省时间,我试图使用extern实例化.但是,如下更改行会产生错误.做正确的方法是什么?(PS使用c ++ 0x标志编译gcc)
typedef myTemplate_base<commonType> myTemplate;
extern template class myTemplate_base<commonType>; //using "extern template myTemplate" wont work
Run Code Online (Sandbox Code Playgroud)
我在项目中添加了一个带有以下内容的额外cpp文件.
template class myTemplate_base<commonType>;
Run Code Online (Sandbox Code Playgroud)
链接器出现此错误消息(myTemplate someVar;将主文件中的第一个对象instantiation()行作为错误源):
未定义的引用'myTemplate_base :: ~myTemplate_base()'
但是,此类型在类中具有以下定义 ~myTemplate() = default;
编辑:如果你有一个更好的标题请评论,所以合适的人看看这个
编辑2:有趣的是,添加template class myTemplate_base<commonType>会极大地增加可执行文件的大小(在450k二进制文件上+ 100k),即使模板在main中使用(编译我必须注释掉extern部分).这暗示链接器保持模板的两个实现具有相同的实例/我忽略了某些东西.