我是MATLAB的新手,它不在工作描述中,我被迫接管编写和维护我公司使用的代码的人.生活很艰难.
我接手的人告诉我,他宣称所有的大数据向量都是global为了节省内存.更具体地说,当一个函数调用另一个函数时,他在传递数据时不会创建数据的副本.
这是真的?我阅读了有效使用内存的策略,它说明了这一点
处理大型数据集时,请注意,如果被调用函数修改了其值,MATLAB将生成输入变量的临时副本.这会暂时使存储阵列所需的内存加倍,这会导致MATLAB在没有足够的内存时生成错误.
它说的内存分配对于数组#Function参数非常相似:
将变量传递给函数时,实际上是将引用传递给变量所代表的数据.只要输入数据不被被调用的函数修改,调用函数中的变量和被调用函数中的变量就指向内存中的相同位置.如果被调用函数修改了输入数据的值,则MATLAB将原始数组的副本复制到内存中的新位置,使用修改后的值进行更新,并将调用函数中的输入变量指向此新数组.
那么使用global可以更好吗?似乎有点草率地轻率地声明所有大数据global,而不是确保没有任何代码修改其输入参数.我错了吗?这真的可以改善RAM的使用吗?
OBJECT如果我在 CMake 中指定库的依赖关系链,则target_link_libraries目标可执行文件中仅使用最后一个库的依赖关系。
最小示例:
main取决于objB,取决于objA。和objA都是CMake 中objB的OBJECT库。
我希望main链接两个目标文件。事实并非如此。
cmake_minimum_required(VERSION 3.13)
project(transitive-object-library-link-issue VERSION 1.0.0 LANGUAGES C)
add_library(objA OBJECT a.c)
add_library(objB OBJECT b.c)
target_link_libraries(objB PUBLIC objA)
# Should link with 'a.o', since 'objA' is "linked" by 'objB'
add_executable(main main.c)
target_link_libraries(main objB)
Run Code Online (Sandbox Code Playgroud)
注意:可在https://github.com/scraimer/cmake-transitive-object-library-link-issue获取工作文件集
如果我更改objA为非OBJECT库,则可以通过摆脱OBJECT库依赖链来消除问题。换句话说,改变线路
add_library(objA OBJECT a.c)
Run Code Online (Sandbox Code Playgroud)
成为:
add_library(objA a.c)
Run Code Online (Sandbox Code Playgroud)
所以这是OBJECT图书馆特有的东西。我应该如何指定要链接的依赖main项objA?(无需objA在每个使用的可执行目标中指定objB)
鉴于每个软件项目只有如此多的程序员专用时间,您将花多少钱来确保产品向后兼容以前的版本?实际上有几点需要考虑:
似乎C#在添加两个数组时UInt16[]比在添加两个数组时更快int[].这对我来说没有意义,因为我会假设数组是字对齐的,因此int[]需要较少的CPU工作,不是吗?
我运行下面的测试代码,得到以下结果:
Int for 1000 took 9896625613 tick (4227 msec)
UInt16 for 1000 took 6297688551 tick (2689 msec)
Run Code Online (Sandbox Code Playgroud)
测试代码执行以下操作:
aand的数组b,一次.a和b逐项添加.这样做了1000次.这是为了int[] a, b和为UInt16 a,b.而每次我运行的代码时,为测试UInt16阵列需要30%不到的时间-50%int阵列.你能解释一下吗?
这是代码,如果你想尝试自己:
public static UInt16[] GenerateRandomDataUInt16(int length)
{
UInt16[] noise = new UInt16[length];
Random random = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < length; ++i)
{ …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用智能指针来升级现有的应用程序,而我正试图克服一个难题.在我的应用程序中,我有一个对象缓存,例如我们称之为书籍.现在,这些书籍缓存是由ID请求的,如果它们在缓存中,则返回它们,如果不是,则从外部系统请求对象(慢速操作)并将其添加到缓存中.一旦进入缓存,可以在应用程序中打开许多窗口,每个窗口都可以参考该书.在以前版本的应用程序中,程序员必须维护AddRef和Release,当每个使用Book对象的窗口关闭时,最终Release(在缓存管理器上)将从缓存中删除对象并删除对象.
您可能已经在链中发现了弱链接,当然程序员记得要调用AddRef和Release.现在我已经转向智能指针(boost :: intrusive)我不再需要担心调用AddRef和Release.然而,这会导致问题,缓存具有对对象的引用,因此当最终窗口关闭时,不通知缓存没有其他人持有引用.
我的第一个想法是定期遍历缓存并清除引用计数为1的对象.我不喜欢这个想法,因为它是一个N阶操作并且感觉不对.我想出了一个回调系统,这个系统更好但不是很棒.我已经包含了回调系统的代码,但我想知道是否有人有更好的方法这样做?
class IContainer
{
public:
virtual void FinalReference(BaseObject *in_obj)=0;
};
class BaseObject
{
unsigned int m_ref;
public:
IContainer *m_container;
BaseObject() : m_ref(0),m_container(0)
{
}
void AddRef()
{
++m_ref;
}
void Release()
{
// if we only have one reference left and we have a container
if( 2 == m_ref && 0 != m_container )
{
m_container->FinalReference(this);
}
if( 0 == (--m_ref) )
{
delete this;
}
}
};
class Book : public BaseObject
{
char *m_name; …Run Code Online (Sandbox Code Playgroud) 我想暂时将目录添加到DLL搜索路径 - 在Windows 7下有正确的方法吗?
脚本
我有一个C#应用程序,我们称之为WonderApp.
WonderApp需要调用位于的C++ DLL C:\MyPath.因此,作为WonderApp的一部分Program.Main(),我添加了以下命令:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,添加一个目录PATH也应该将它添加到目录搜索DLL.
该解决方案在Windows XP中运行良好:如果我将目录添加到PATH,则加载DLL并且程序运行正常.如果我不添加目录,则DLL不会加载,失败并显示"未找到"错误.
但是,这不适用于Windows 7.
所以我想,让我们试试吧SetDllDirectory().像这样:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
Run Code Online (Sandbox Code Playgroud)
后来:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
Run Code Online (Sandbox Code Playgroud)
的价值success是true,但DLL仍然不能加载.
最后,如果我在运行应用程序之前手动设置PATH为包含C:\MyPath- 它一切正常!DLL加载,运行得很好.
所以,要重新迭代:
是否有正确的方法将目录临时添加到Windows 7下的DLL搜索路径?
更新:使用Process Explorer,我检查了应用程序的运行时环境,"C:\ MyPath"确实在PATH!此外,我看到它Helper.dll位于打开句柄列表中(作为DLL,而不仅仅是文件) - 它仍然声称没有找到它.
我正在一个项目中工作,其中数据库项目未被删除,但仅标记为已删除.像这样的东西:
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 0
Run Code Online (Sandbox Code Playgroud)
我希望能够在name列上定义类似UNIQUE约束的内容.看起来很简单吧?
让我们假设一个场景,其中"Thingy3"被删除,并创建一个新的(可能在几年后).我们得到:
id name deleted
--- ------- --------
1 Thingy1 0
2 Thingy2 0
3 Thingy3 1
...
100 Thingy3 0
Run Code Online (Sandbox Code Playgroud)
从用户的角度来看,他删除了一个项目并创建了一个新项目.就像删除文件和创建新文件一样.因此,对他来说很明显,新项目与连接到旧项目的任何数据无关且未附加.
这已经处理完了,因为DB只关心它id,并且由于新项目的数量id为100而不是3,它们完全不同.
当我想阻止用户创建另一个 "Thingy3"项时,我的困难就出现了.如果我有一个UNIQUE约束只查看未标记的项目deleted,那么我会解决一个问题.
(当然,那时我必须处理当有人撤消删除时会发生什么......)
那么,我该如何定义那种约束呢?
我有一些来自http://www.hyllander.org/node/23的代码使用$*("美元星号"或"美元星"),但我的perl版本报告:
$* is no longer supported at migrate.pl line 284.
Run Code Online (Sandbox Code Playgroud)
你知道做什么的副作用吗?
$*=1
Run Code Online (Sandbox Code Playgroud)
这是否会以某种方式影响函数split或标记符或正则表达式?
我看到它会$element.is(':animated')告诉我$ element是否正在动画,但是有可能看到哪些css属性正在被动画化.