我想实现一个两遍缓存系统:
第一遍生成一个PHP文件,其中包含硬编码的所有常见内容(例如新闻项).然后数据库有一个缓存表来链接这些页面(例如"index.php page = 1 style = default"),数据库还存储一个uptodate字段,如果为false则导致第一次传递在下一次页面重新运行被观看了.
第二遍填写次要细节,例如多久以前的东西(?),以及可变项目,例如"你以......登录".
但是,我不确定一个有效的实现,它支持缓存和非缓存(例如,搜索)页面,没有大量的代码和几个查询.
现在每次加载页面时,PHP脚本都会重新生成页面.对于像搜索这样的页面,这很好,因为大多数搜索是不同的,但对于其他页面,例如索引,这对于每个命中几乎是相同的,但是生成大量查询并且是相当长的脚本.
问题是页面的某些部分会根据每个用户进行更改,例如"您已登录为..."部分,因此只需保存生成的页面仍然会产生10,000个几乎相同的页面.
主要关注的是减少服务器上的负载,因为我在共享主机上并且此时无法承受升级,但是该站点正在使用相当大一部分服务器CPU +对MySQL进行公平加载服务器.
所以基本上最小化每个页面请求需要做多少,而不是像索引那样一直是一个好的开始,而不是重新生成像索引上的新闻一样的东西.
我实际上认为将新闻项目硬编码为纯HTML,但这意味着在几个地方维护它们(因为它们可能用于搜索,而评论在专用于该新闻项目的页面上(即news.php)等) .
我打算用c#而不是c ++(使用SlimDX)来完成我的下一个项目.
所有directX都使用浮点数,但System.Math使用双精度数.这意味着不断在浮动和双打之间进行转换.
理想情况下,我想使用浮点数编写所有代码,因为无论如何我都没有获得任何额外的精度从双打转换为浮点数...
但是我一直无法为使用浮点数的.net找到一组数学函数.我当然可以在c#中编写我自己的库,但是我更喜欢使用已经优化的现有库...
如何确保dll在其中存在任何对象时不会被卸载?
问题是,当我使用explict内存管理时,我可以在释放dll之前删除dll对象,但是使用智能指针我无法控制它们被破坏的顺序,这意味着dll可能会在尝试释放时首先释放导致崩溃其他一个对象:
FlPtr是一个简单的引用计数类,可根据需要调用AddRef和Release
ExampleDll *dll = LoadDll(L"bin\\example.dll");
IObject *obj = dll->CreateObject();
...
obj->Release();
delete dll;//fine because all objects already deleted
return 0;
auto_ptr<ExampleDll> dll = LoadDll(L"bin\\example.dll");
FlPtr<IObject> obj = dll->CreateObject();
...
return 0;//crash if dll is destructed before obj since Object::Release needs to call into the dll
Run Code Online (Sandbox Code Playgroud)
我试着让dll句柄自己卸载,即只删除所有对象后卸载.这项工作是通过创建一个dll实现的新对象IExampleDll.这就像之前的ExampleDll对象一样,但它位于dll而不是exe中,并且也是refrence计数的.dll中的每个对象都会增加对构造的依赖,并在破坏时将其减去.这意味着当exe释放它的引用并且所有dll对象都被破坏时,引用计数才会达到零.然后删除它自己在析构函数中调用FreeLibrary(GetModuleHandle()).
然而,这在FreeLibrary中崩溃了,因为线程仍然在正在卸载的dlls代码中...
我现在不知道如何确保只在没有剩余对象的情况下卸载dll,除了在其他所有内容都应该删除之后再显示释放dll;
int main()
{
ExampleDll *dll = LoadDll("bin\\example.dll");
restOfProgram();
delete dll;
}
Run Code Online (Sandbox Code Playgroud)
当需要在程序中间加载/卸载dll时,即当用户在选项中从d3d更改为openGL时,这种方法变得困难.
我需要在 python 对象和各种编码的 c 字符串之间进行转换。使用 PyUnicode_Decode 从 ac 字符串到 unicode 对象相当简单,但是我不知道如何走另一条路
//char* can be a wchar_t or any other element size, just make sure it is correctly terminated for its encoding
Unicode(const char *str, size_t bytes, const char *encoding="utf-16", const char *errors="strict")
:Object(PyUnicode_Decode(str, bytes, encoding, errors))
{
//check for any python exceptions
ExceptionCheck();
}
Run Code Online (Sandbox Code Playgroud)
我想创建另一个函数,它接受 python Unicode 字符串并使用给定的编码将其放入缓冲区中,例如:
//fills buffer with a null terminated string in encoding
void AsCString(char *buffer, size_t bufferBytes,
const char *encoding="utf-16", const char *errors="strict")
{
... …Run Code Online (Sandbox Code Playgroud) 有没有办法创建一个类似于基本类型之一的新类型(例如char),并且可以在它们之间进行有意义的转换,但是会在模板中进行不同的解析,例如,以下代码有效吗?
typedef char utf8;
template<typename T>void f(T c);
template<> void f<char>(char c)
{
std::cout << "ascii " << c << std::endl;
}
template<> void f<utf8>(utf8 c)//error C2766: explicit specialization; 'void f<char>(char)' has already been defined
{
std::cout << "utf8 " << c << std::endl;
}
int main()
{
char c1 = 'x';
utf8 c2 = 'g';
f(c1);
f(c2);
}
Run Code Online (Sandbox Code Playgroud)
我认为有可能使用包含单个数据成员的类,如果是这样,最简单的方法是什么,并且编译器能够优化它,就像它是原始的一样.
编辑:我尝试了BOOST_STRONG_TYPEDEF,这似乎适用于基本的东西,但我怎么能从新类型创建一个std :: basic_string?
BOOST_STRONG_TYPEDEF(char,utf8);
//first try
BOOST_STRONG_TYPEDEF(std::string,utf8_string);
//second try
typedef std::basic_string<utf8, std::char_traits<utf8>,std::allocator<utf8> > uft8_string;
Run Code Online (Sandbox Code Playgroud)
第一个没有真正起作用,因为结果类型仍然期望其所有方法的char,而第二个似乎不喜欢构造函数和赋值运算符的存在:(
我还没有尝试过另一种方法来创建新的char类型,如果我不能使用BOOST_STRONG_TYPEDEF,它是否可以解决这个问题?
我正在使用Java API,这需要我实现许多相当大的接口。但是,通常在实现之间实际上只有一两个细节有所不同,因此我制作了一些抽象基类来提供大多数实现。
但是,现在我遇到了需要从其他一些类扩展和/或实现多个此类接口的情况,因此我无法扩展我的抽象基类。
在C ++中,我可以使用多重继承,还可以使用下面的其他技巧。但是,Java不允许多重继承,也不允许以这种方式使用泛型。
class MyClass : public HelperForInterfaceA, public HelperForInterfaceB {...};
class template<class BASE> MyHelper : public BASE {...};
Run Code Online (Sandbox Code Playgroud)
我现在最好的想法是将抽象帮助程序类的具体实现作为一个字段,然后将所有接口方法转发到该字段实例,而该字段引用了主要对象以实现最后的细节如果需要的话。
class MyClass extends A implements IB, IC {
private static class B extends BAbstractHelper {
private A a;
public B(A a, int size) {
super(size);
this.a = a;
}
@Override
public boolean foo(int x, int y) {
return a.foo(x, y);
}
}
private static class C extends CAbstractHelper {
...
}
private B b;
private C c;
private …Run Code Online (Sandbox Code Playgroud) 我需要为不同的API /模块在UTF-8,UTF-16和UTF-32之间进行转换,因为我知道可以选择使用C++ 11查看新的字符串类型.
它看起来像我可以使用string,u16string并u32string为UTF-8,UTF-16和UTF-32.我还发现codecvt_utf8与codecvt_utf16这一下就能够做到之间的转换char或者char16_t和char32_t什么看起来像一个较高的水平wstring_convert,但只出现与字节/工作std::string和文件不是很大.
我是不是想以wstring_convert某种方式使用UTF-16↔UTF-32和UTF-8↔UTF-32机箱?我只是真的找到了UTF-8到UTF-16的例子,我甚至不确定它在Linux上wchar_t通常被认为是UTF-32 是正确的......还是直接用那些代码解析器做一些更复杂的事情?
或者这仍然没有真正处于可用状态,我应该坚持使用8,16和32位无符号整数的现有小程序?
我有 200 组大约 50,000 个范围在 0 到 500,000 之间的唯一整数,我需要映射到另一个小值(一对整数,值不相关,因此不需要按需计算)。
我尝试使用 std::unordered_maps,这使用了大约 50MB(在 VS2015 堆诊断工具中测量),虽然性能很好,但我希望降低此内存使用量(打算成为一些小型 500MB 云服务器上的后台服务) 。
实际上我的初始版本是 200 个单独的std::unordered_map<int, std::pair<int, int>>.
一种选择似乎是排序数组并使用二分搜索,但还有其他选择吗?
列表项可能包含几个段落、图像等。它们都应该位于项目编号的右侧。
#page {
width: 200px;
}
li {
margin: 1em 0;
}
ol {
padding: 0;
}Run Code Online (Sandbox Code Playgroud)
<div id="page">
<p>Some text</p>
<ol>
<li>A list item</li>
<li>A multiline list item another line</li>
<li>
<p>A list item containing blocks such as example images:</p>
<div style="width:128px;height:48px;background:#CCC">Example<br/>Image</div>
</li>
</ol>
<p>Some more text</p>
</div>Run Code Online (Sandbox Code Playgroud)
理想情况下,我更愿意保留列表标签,而不是使用表格或其他一组定位的通用块。
我正在看一些代码,除了空指针之外,还使用了一些特殊值,例如(T*)-1,如果某些“创建”函数失败,通常将它们用作返回值。
如果所指向的类型足够大,以至于((T*)-n) + sizeof(T)会溢出,则意味着该地址实际上无法分配给类型T的实例,这样可以吗?编译器可以看到类似的东西if (ptr == (T*)-1),确定不可能并对其进行优化吗?